java– 使用glVertexAttribPointer和glDrawElements从压缩顶点缓冲区中绘制

java– 使用glVertexAttribPointer和glDrawElements从压缩顶点缓冲区中绘制,第1张

概述我有一个打包的顶点缓冲区,包含位置坐标以及格式为{X,Y,Z,R,G,B,A}的顶点的颜色值.当我通过取出a_Color属性并硬编码gl_FragColor的vec4值但是我无法将颜色vec4属性传递到片段着色器(矩形)时,我可以使用硬编码颜色正确显示矩形.将不会显示在该场景中).使用glVertexAttribPointer(

我有一个打包的顶点缓冲区,包含位置坐标以及格式为{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从压缩顶点缓冲区中绘制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1109781.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存