
我有一个打包的顶点缓冲区,包含位置坐标以及格式为{X,Y,Z,R,G,B,A}的顶点的颜色值.
当我通过取出a_color属性并硬编码gl_Fragcolor的vec4值但是我无法将颜色vec4属性传递到片段着色器(矩形)时,我可以使用硬编码颜色正确显示矩形.将不会显示在该场景中).
使用glVertexAttribPointer(…)和glDrawElements(…)从OpenGL ES 2.0中的压缩顶点缓冲区绘制的正确方法是什么?
请参阅下面的代码:
public class GameRenderer implements Renderer { public static final int POS_SZ = 3; public static final int Col_SZ = 4; public static final int float_SZ = 4; public static final int SHORT_SZ = 2; private floatBuffer grIDVB; private ShortBuffer gridindices; int programCode, papositionHandle, pacolorHandle, puMVPMatrixHandle; private final String vertexshadercode = "uniform mat4 u_MVPMatrix; \n" + "attribute vec4 a_position; \n" + "voID main(){ \n" + " gl_position = u_MVPMatrix * a_position; \n" + "} \n"; private String fragmentshadercode = "precision mediump float; \n" + "attribute vec4 a_color; \n" + "voID main(){ \n" + " gl_Fragcolor = a_color; \n" + "} \n"; public voID staticGrID() { float vertexArray[] = { -0.75f, 0.75f, 0.0f, // position 0.0f, 0.0f, 1.0f, 1.0f, // colour 0.75f, 0.75f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.75f, -0.75f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, -0.75f, -0.75f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f }; short indicesArray[] = { 0, 1, 2, 0, 2, 3 }; ByteBuffer vbb = ByteBuffer.allocateDirect(vertexArray.length * float_SZ); vbb.order(ByteOrder.nativeOrder()); grIDVB = vbb.asfloatBuffer(); grIDVB.put(vertexArray); grIDVB.position(0); ByteBuffer ibb = ByteBuffer.allocateDirect(indicesArray.length * SHORT_SZ); ibb.order(ByteOrder.nativeOrder()); gridindices = ibb.asShortBuffer(); gridindices.put(indicesArray); gridindices.position(0); } public voID onSurfaceCreated(GL10 unused, EGLConfig arg1) { GLES20.glClearcolor(0.5f, 0.5f, 0.5f, 1.0f); staticGrID(); int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexshadercode); int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentshadercode); programCode = GLES20.glCreateProgram(); GLES20.glAttachShader(programCode, vertexShader); GLES20.glAttachShader(programCode, fragmentShader); GLES20.gllinkProgram(programCode); papositionHandle = GLES20.glGetAttribLocation(programCode, "a_position"); pacolorHandle = GLES20.glGetAttribLocation(programCode, "a_color"); puMVPMatrixHandle = GLES20.glGetUniformlocation(programCode, "u_MVPMatrix"); } public voID onDrawFrame(GL10 unused) { GLES20.glClear(GLES20.GL_color_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); GLES20.gluseProgram(programCode); int strIDe = (POS_SZ + Col_SZ) * float_SZ; int indices_cnt = 6; grIDVB.position(0); GLES20.glEnabLevertexAttribarray(papositionHandle); GLES20.glVertexAttribPointer(papositionHandle, POS_SZ, GLES20.GL_float, false, strIDe, grIDVB); grIDVB.position(POS_SZ); GLES20.glEnabLevertexAttribarray(pacolorHandle); GLES20.glVertexAttribPointer(pacolorHandle, Col_SZ, GLES20.GL_float, false, strIDe, grIDVB); // matrix manipulation ... GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices_cnt, GLES20.GL_UNSIGNED_SHORT, gridindices); }}解决方法:
片段着色器不使用属性.属性是每顶点值,片段着色器不会知道任何内容.您要做的是将颜色作为属性应用于顶点着色器,然后使用变量将颜色传递给片段着色器.
另外,请开始使用着色器的错误检查,它会告诉您何时出现这样的错误:
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetProgramiv.xml(检查GL_link_STATUS)
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetShaderiv.xml(检查GL_COMPILE_STATUS)
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetProgramInfoLog.xml
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetShaderInfoLog.xml
总结以上是内存溢出为你收集整理的java – 使用glVertexAttribPointer和glDrawElements从压缩顶点缓冲区中绘制全部内容,希望文章能够帮你解决java – 使用glVertexAttribPointer和glDrawElements从压缩顶点缓冲区中绘制所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)