如何使用Open GL ES绘图贴图后画线不会自动贴上纹理 opengl安卓 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 画完四边形之后 采用不使用纹理的shader画线 你说的是graphic的那个shader么? 你说的是graphic的那个shader么?画四边形和线用不同的着色器 方法 1 注意与视点的距离,同样距离,后绘制的会被丢弃。方法 2 使用blend。 能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?第二点 blend 是如何使用来达到目的的?谢谢 你说的是graphic的那个shader么?画四边形和线用不同的着色器问个小白问题,没有使用着色器渲染的图形是用什么渲染的 能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?第二点 blend 是如何使用来达到目的的?谢谢1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。 2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND) GLES20.glBlendFunc 能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?第二点 blend 是如何使用来达到目的的?谢谢1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。 2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND) GLES20.glBlendFunc谢大神回复 在未使用blend的情况下 我将绘制的线在z轴方向调整了位移,不过还是被纹理给渲染了 能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?第二点 blend 是如何使用来达到目的的?谢谢1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。 2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND) GLES20.glBlendFunc谢大神回复 在未使用blend的情况下 我将绘制的线在z轴方向调整了位移,不过还是被纹理给渲染了贴些代码吧 ,关键的绘制段代码 还是有shader 不然没法分析。 能否详细点说明,第一点说的视点指的是哪一个视点,意思是绘制在同一个平面是么?第二点 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); }大神麻烦帮我看看 恩 你在初始化时候 就把纹理对象绑定好了。所以在你的ondraw 时候 全部是纹理贴图的ondraw(){grl.glDisable(GL10.GL_TEXTURE_2D);drawline()grl.glEnable(GL10.GL_TEXTURE_2D);bindTexture();drawRectangle();}ps 上面一段代码 还是可以优化 一语惊醒梦中人,太感谢大神了,不过还有个小问题,改成这样后,线条的颜色一直都是白色的,改了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); } gl.glColor4f(1, 0, 0, 1); RGBA A入门推荐你看这本 [Android.游戏开发入门](美)Mario.Zechner.插图版_1 线条的颜色还是没有变化,要看英文原版吗?听说中文版很多翻译错误建议 先单独各自绘制, 然后再合并, 一条条命令的追加 这样你对每行代码的含义会有比较深的理解。你这样糅合在一起, 很难发现到底哪里出问题了。尽量看英文版, 不要相信翻译(比较困难的话, 中英对照看。)我一个个地排除 发现是 gl.glEnable(GL10.GL_LIGHTING); // 启用光照gl.glEnable(GL10.GL_LIGHT0); // 开启光源0这两句代码造成线颜色一直不会更改但是去掉这两行代码,绑定的纹理图案又会失去正常的颜色(绿色的纹理图案变成了红色的纹理图案)这个问题真摸不着头脑,另外,shader着色器这个东西有没有必要用? shader 是openGl 2.0 以后的 可编程着色器 、目前你学的是 1.x 固定管道 2.0 更复杂 1.x 基本概念学差不多了 再学2.0. gl.glDrawElements(GL10.GL_LINES, indices.length,GL10.GL_UNSIGNED_SHORT, indexBuffer);这样不就能够直接画线了嘛,传入的顶点缓存和索引缓存是线段那种方式组织的。 不要学1.0,知道原理就行了,别浪费时间,直接学ES2.0,速度及特效没法比(粒子系统等),学ES2.0,调试直接使用android4.3+的模拟器,编译着色器代码有报错功能,太强大了!别担心版本问题,只要是支持ES2.0都可以的,出成品改动一下最终版本就行了!调试好的着色器,一定要用实机测试一次,模拟器跟实机是有着别,特别是数据类型比较,一点小差别就出错,呵呵 画完四边形之后 采用不使用纹理的shader画线 android List获取图片路径问题 【分享】Zookeeper 的学习与运用 求给力的反编译软件 求大虾们指点 空指针异常 用VB6的人,可以学ANDROID吗? browseTo()这个方法是什么意思怎么用 通话时,播放音乐所带来的音频驱动调度问题 android中登陆的帐号密码保存在哪? Android sdk 8 以上版本的开发中,无法联网的问题 使用Retrofit请求可以串行执行吗 悬浮窗体 WindowManager 问题 安卓陀螺仪数据问题。。不容易察觉的细节。
方法 2 使用blend。
第二点 blend 是如何使用来达到目的的?谢谢
问个小白问题,没有使用着色器渲染的图形是用什么渲染的
第二点 blend 是如何使用来达到目的的?谢谢
1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。
2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND)
GLES20.glBlendFunc
第二点 blend 是如何使用来达到目的的?谢谢
1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。
2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND)
GLES20.glBlendFunc
谢大神回复 在未使用blend的情况下 我将绘制的线在z轴方向调整了位移,不过还是被纹理给渲染了
第二点 blend 是如何使用来达到目的的?谢谢
1 视点简单说法 就是相机的位置,就是你的眼睛。相同平面上,后绘制的物体会通不过深度检测(可以关闭深度检测,是否有效未知,你可以测试下)。 绘制线时候调整下位置, 往前挪动点。
2 blend 就是混合色素,绘制第二个物体是 打开混合效果,会把物体颜色混合一起。(具体使用查API)GLES20.glEnable(GLES20.GL_BLEND)
GLES20.glBlendFunc
谢大神回复 在未使用blend的情况下 我将绘制的线在z轴方向调整了位移,不过还是被纹理给渲染了贴些代码吧 ,关键的绘制段代码 还是有shader 不然没法分析。
第二点 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);
}大神麻烦帮我看看
grl.glDisable(GL10.GL_TEXTURE_2D);
drawline()
grl.glEnable(GL10.GL_TEXTURE_2D);
bindTexture();
drawRectangle();}ps 上面一段代码 还是可以优化
改成这样后,线条的颜色一直都是白色的,改了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);
}
[Android.游戏开发入门](美)Mario.Zechner.插图版_1
你这样糅合在一起, 很难发现到底哪里出问题了。
尽量看英文版, 不要相信翻译(比较困难的话, 中英对照看。)
我一个个地排除 发现是
gl.glEnable(GL10.GL_LIGHTING); // 启用光照
gl.glEnable(GL10.GL_LIGHT0); // 开启光源0
这两句代码造成线颜色一直不会更改
但是去掉这两行代码,绑定的纹理图案又会失去正常的颜色(绿色的纹理图案变成了红色的纹理图案)
这个问题真摸不着头脑,另外,shader着色器这个东西有没有必要用?
这样不就能够直接画线了嘛,传入的顶点缓存和索引缓存是线段那种方式组织的。
调试好的着色器,一定要用实机测试一次,模拟器跟实机是有着别,特别是数据类型比较,一点小差别就出错,呵呵