解决方案 »

  1.   

    画完四边形之后 采用不使用纹理的shader画线
      

  2.   

    你说的是graphic的那个shader么?
      

  3.   

    你说的是graphic的那个shader么?画四边形和线用不同的着色器
      

  4.   

    方法 1 注意与视点的距离,同样距离,后绘制的会被丢弃。
    方法 2  使用blend。
      

  5.   

    能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?
    第二点 blend 是如何使用来达到目的的?谢谢
      

  6.   

    你说的是graphic的那个shader么?画四边形和线用不同的着色器
    问个小白问题,没有使用着色器渲染的图形是用什么渲染的
      

  7.   

    能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?
    第二点 blend 是如何使用来达到目的的?谢谢
    1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。 
    2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND)
     GLES20.glBlendFunc
      

  8.   

    能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?
    第二点 blend 是如何使用来达到目的的?谢谢
    1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。 
    2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND)
     GLES20.glBlendFunc
    谢大神回复 在未使用blend的情况下 我将绘制的线在z轴方向调整了位移,不过还是被纹理给渲染了
      

  9.   

    能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?
    第二点 blend 是如何使用来达到目的的?谢谢
    1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。 
    2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND)
     GLES20.glBlendFunc
    谢大神回复 在未使用blend的情况下 我将绘制的线在z轴方向调整了位移,不过还是被纹理给渲染了贴些代码吧 ,关键的绘制段代码 还是有shader 不然没法分析。
      

  10.   

    能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?
    第二点 blend 是如何使用来达到目的的?谢谢
    1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。 
    2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND)
     GLES20.glBlendFunc
    谢大神回复 在未使用blend的情况下 我将绘制的线在z轴方向调整了位移,不过还是被纹理给渲染了
    public class SquareRenderer implements GLSurfaceView.Renderer { private static final String TAG = SquareRenderer.class.getSimpleName(); Bitmap bmp; private Square mSquare = new Square();
    private float mAngle = 0;
    public float Scale = 1.0f;

    float textureCoordinates[] = { 0.0f, 1.0f, //
    1.0f, 1.0f, //
    0.0f, 0.0f, //
    1.0f, 0.0f };
    FloatBuffer texBuff;

    float skySquareCoords[] = { -2.0f, 2.0f, 0.5f, // 0, Top Left
    -2.0f, -2.0f, 0.5f, // 1, Bottom Left
    2.0f, -2.0f, 0.5f, // 2, Bottom Right
    2.0f, 2.0f, 0.5f, // 3, Top Right
    };
    FloatBuffer skyBuffer; float lineCoordinates[] = { 1.0f, 1.0f, 0.5f,//
    1.0f, -1.0f, 0.5f };
    FloatBuffer lineBuffer;
    private short[] lineInd = { 0, 1 };
    private ShortBuffer lineIndBuffer; private short[] indices = { 0, 1, 2, 0, 2, 3 };

    private ShortBuffer indexBuffer;

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    lineBuffer = BufferUtil.floatToBuffer(lineCoordinates);
    lineIndBuffer = BufferUtil.shortToBuffer(lineInd);
    skyBuffer = BufferUtil.floatToBuffer(skySquareCoords);
    indexBuffer = BufferUtil.shortToBuffer(indices);
    // 告诉系统对透视进行修正
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    // 用黑色来清除屏幕颜色
    gl.glClearColor(0, 0, 0, 0);
    // 启用阴影平滑
    gl.glShadeModel(GL10.GL_SMOOTH);
    // 设置深度缓存
    gl.glClearDepthf(1.0f);
    // 启用深度测试
    gl.glEnable(GL10.GL_DEPTH_TEST);
    // 所做深度测试的类型
    gl.glDepthFunc(GL10.GL_LEQUAL); init(gl);
    } @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) { float ratio = (float) width / height;
    // 设置OpenGL场景的大小,(0,0)表示窗口内部视口的左下角,(w,h)指定了视口的大小
    gl.glViewport(0, 0, width, height);
    // 设置投影矩阵
    gl.glMatrixMode(GL10.GL_PROJECTION);
    // 重置投影矩阵
    gl.glLoadIdentity();
    // 设置视口的大小
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    // 以下两句告诉opengl es,以后所有的变换都将影响这个模型(即我们绘制的图形)
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    // 设置透视范围
    GLU.gluPerspective(gl, 45.0f, ((float) width) / height, 0.1f, 10f); } @Override
    public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();


    gl.glTranslatef(0, 0, -2);
    gl.glScalef(Scale, Scale, 1.0f);
    gl.glRotatef(-45, 1.0f, 0.0f, 0.0f);  mAngle += 1;
    // Draw our square. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    // 画线
    // gl.glMatrixMode(GL10.GL_MODELVIEW); GLES20.glEnable(GLES20.GL_BLEND);
    gl.glColor4f(0.0f, 1.0f, 0.0f, 0.0f);
    gl.glLineWidth(5.0f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, lineBuffer);
    gl.glDrawArrays(GL10.GL_LINES, 0, 2);

    draw(gl); // ( 绘制四边形)
    } protected void init(GL10 gl) {
    bmp = BitMapManager.getBitmap();
    texBuff = BufferUtil.floatToBuffer(textureCoordinates); gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// 设置清屏时背景的颜色,R,G,B,A gl.glEnable(GL10.GL_LIGHTING); // 启用光照
    gl.glEnable(GL10.GL_LIGHT0); // 开启光源0
    // 设置光照参数,也可以使用默认的,不设置
    // gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0);
    // gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0);
    // gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPos, 0);
    //
    // gl.glNormalPointer(GL10.GL_FLOAT, 0, normBuff);
    // gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); // 使用纹理步骤:
    // 1.开启贴图
    gl.glEnable(GL10.GL_TEXTURE_2D); // 2.生成纹理ID
    int[] tmp_tex = new int[1];// 尽管只有一个纹理,但使用一个元素的数组
    // glGenTextures(申请个数,存放数组,偏移值)
    gl.glGenTextures(1, tmp_tex, 0); // 向系统申请可用的,用于标示纹理的ID
    int texture = tmp_tex[0]; // 3.绑定纹理,使得指定纹理处于活动状态。一次只能激活一个纹理
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture); // 4.绑定纹理数据,传入指定图片
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0); // 5.传递各个顶点对应的纹理坐标
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texBuff);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // 开启纹理坐标数组 // 6.设置纹理参数 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
    GL10.GL_NEAREST);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
    GL10.GL_NEAREST); gl.glEnable(GL10.GL_DEPTH_TEST); // 启用深度缓存
    // gl.glEnable(GL10.GL_CULL_FACE); // 启用背面剪裁
    gl.glClearDepthf(1.0f); // 设置深度缓存值
    gl.glDepthFunc(GL10.GL_LEQUAL); // 设置深度缓存比较函数,GL_LEQUAL表示新的像素的深度缓存值小于等于当前像素的深度缓存值(通过gl.glClearDepthf(1.0f)设置)时通过深度测试
    gl.glShadeModel(GL10.GL_SMOOTH);// 设置阴影模式GL_SMOOTH
    }public void draw(GL10 gl) {
    gl.glFrontFace(GL10.GL_CCW); gl.glEnable(GL10.GL_CULL_FACE); gl.glCullFace(GL10.GL_BACK);
    gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f); gl.glVertexPointer(3, GL10.GL_FLOAT, 0,
    vertexBuffer); gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
    GL10.GL_UNSIGNED_SHORT, indexBuffer);
    }大神麻烦帮我看看
      

  11.   

    恩 你在初始化时候 就把纹理对象绑定好了。所以在你的ondraw  时候  全部是纹理贴图的ondraw(){
    grl.glDisable(GL10.GL_TEXTURE_2D);
    drawline()
    grl.glEnable(GL10.GL_TEXTURE_2D);
    bindTexture();
    drawRectangle();}ps 上面一段代码 还是可以优化
      

  12.   

    一语惊醒梦中人,太感谢大神了,不过还有个小问题,
    改成这样后,线条的颜色一直都是白色的,改了RGB比例也不会变化
    @Override
    public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    gl.glTranslatef(0, 0, -2);
    gl.glScalef(Scale, Scale, 1.0f);
    gl.glRotatef(-45, 1.0f, 0.0f, 0.0f);  mAngle += 1;
    // Draw our square. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    //关闭纹理
    gl.glDisable(GL10.GL_TEXTURE_2D);
    //画线
    gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f);
    gl.glLineWidth(3.0f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, lineBuffer);
    gl.glDrawArrays(GL10.GL_LINES, 0, 2);
    //开启纹理
    gl.glEnable(GL10.GL_TEXTURE_2D);
    //画四边形
    mSquare.draw(gl); // gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
    }
      

  13.   

    gl.glColor4f(1, 0, 0, 1);   RGBA    A入门推荐你看这本 
    [Android.游戏开发入门](美)Mario.Zechner.插图版_1
      

  14.   

    线条的颜色还是没有变化,要看英文原版吗?听说中文版很多翻译错误建议  先单独各自绘制, 然后再合并, 一条条命令的追加  这样你对每行代码的含义会有比较深的理解。
    你这样糅合在一起, 很难发现到底哪里出问题了。
    尽量看英文版, 不要相信翻译(比较困难的话, 中英对照看。)
    我一个个地排除 发现是
    gl.glEnable(GL10.GL_LIGHTING); // 启用光照
    gl.glEnable(GL10.GL_LIGHT0); // 开启光源0
    这两句代码造成线颜色一直不会更改
    但是去掉这两行代码,绑定的纹理图案又会失去正常的颜色(绿色的纹理图案变成了红色的纹理图案)
    这个问题真摸不着头脑,另外,shader着色器这个东西有没有必要用?
      

  15.   

    shader 是openGl 2.0 以后的 可编程着色器  、目前你学的是 1.x  固定管道   2.0 更复杂   1.x 基本概念学差不多了 再学2.0.
      

  16.   

    gl.glDrawElements(GL10.GL_LINES, indices.length,GL10.GL_UNSIGNED_SHORT, indexBuffer);
    这样不就能够直接画线了嘛,传入的顶点缓存和索引缓存是线段那种方式组织的。
      

  17.   

    不要学1.0,知道原理就行了,别浪费时间,直接学ES2.0,速度及特效没法比(粒子系统等),学ES2.0,调试直接使用android4.3+的模拟器,编译着色器代码有报错功能,太强大了!别担心版本问题,只要是支持ES2.0都可以的,出成品改动一下最终版本就行了!
    调试好的着色器,一定要用实机测试一次,模拟器跟实机是有着别,特别是数据类型比较,一点小差别就出错,呵呵
      

  18.   

    画完四边形之后 采用不使用纹理的shader画线