c - glDrawArrays 在启用颜色顶点数组 OpenGL ES 2.0 时崩溃

标签 c opengl-es opengl-es-2.0

下面的代码可以正常工作并绘制一个等边的彩色三角形:

GLfloat triangle_pos[] =
                 {
            -0.5, -0.25, 0.0,
             0.5, -0.25, 0.0,
             0.0, 0.559016994, 0.0
                 };

void draw_triangle()
{
 glUseProgram(SHADER.program);

 matrix mv;
 multiply_matrix(VIEW_MATRIX/*ident*/, MODEL_MATRIX/*ident*/, mv);
 matrix mvp;
 multiply_matrix(PROJECTION_MATRIX/*ortho*/, mv, mvp);

 glUniformMatrix4fv(SHADER.uniforms[0]/*um_mvp*/, 1, GL_FALSE, mvp);

 glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

 glDrawArrays(GL_TRIANGLES, 0, 3);

 glDisableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);

 glUseProgram(0);
}

顶点着色器:

attribute vec4 av_pos;
varying vec4 vv_col;
uniform mat4 um_mvp;
void main()
{
 vv_col = um_mvp * av_pos;
 gl_Position = vv_col; 
} 

片段着色器:

precision lowp float;
varying vec4 vv_col;
void main()
{
 gl_FragColor = vv_col;
}   

让我们更改顶点着色器以从外部加载颜色值:

attribute vec4 av_pos;
attribute vec4 av_col;
varying vec4 vv_col;
uniform mat4 um_mvp;
void main()
{
 vv_col = av_col
 gl_Position = um_mvp * av_pos; 
}  

修改后的代码为:

GLfloat triangle_pos[] =
                 {
            -0.5, -0.25, 0.0,
             0.5, -0.25, 0.0,
             0.0, 0.559016994, 0.0
                 };

GLfloat triangle_col[]=
                 {
    1.0,0.0,1.0,1.0,
    0.0,1.0,1.0,1.0,
    1.0,0.0,0.0,1.0
                 };



void draw_triangle()
{
 glUseProgram(SHADER.program);

 matrix mv;
 multiply_matrix(VIEW_MATRIX, MODEL_MATRIX, mv);
 matrix mvp;
 multiply_matrix(PROJECTION_MATRIX, mv, mvp);

 glUniformMatrix4fv(SHADER.uniforms[0]/*um_mvp*/, 1, GL_FALSE, mvp);

 glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

 glEnableVertexAttribArray(SHADER.atributes[1]/*av_col*/);
 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, triangle_col);

 glDrawArrays(GL_TRIANGLES, 0, 3); // just crashing i can't even glGetError() after that line

 glDisableVertexAttribArray(SHADER.atributes[0]);

 glDisableVertexAttribArray(SHADER.atributes[1]);

 glUseProgram(0);
}

为什么 glDrawArrays 崩溃以及如何解决?

最佳答案

glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

glEnableVertexAttribArray(SHADER.atributes[1]/*av_col*/);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, triangle_col);

glVertexAttribPointer的第一个参数是要设置的属性。它与您给 glEnableVertexAttribArray 的值相同.所以这应该是:

glEnableVertexAttribArray(SHADER.atributes[0]/*av_pos*/);
glVertexAttribPointer(SHADER.atributes[0], 3, GL_FLOAT, GL_FALSE, 0, triangle_pos);

glEnableVertexAttribArray(SHADER.atributes[1]/*av_col*/);
glVertexAttribPointer(SHADER.atributes[1], 4, GL_FLOAT, GL_FALSE, 0, triangle_col);

关于c - glDrawArrays 在启用颜色顶点数组 OpenGL ES 2.0 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9743952/

相关文章:

c - 使用 SDL2、openGL ES 2.0 (GLSL 1.0) 和 Freetype 渲染字体

c++ - 可以这样使用函数指针吗?

objective-c - 如何创建指向结构的指针并对其进行类型转换?

iphone - 渲染到纹理或离屏帧缓冲区

android - OpenGL (ES) -- 截锥体和正视体有什么区别?

android - 在 Android 上将位图压缩为 ASTC 运行时

c++ - 无法构建 opengl es 2.0 c++ native android 项目。 ( fatal error : android/sensor. h:没有这样的文件或目录)

c - 计算 pi 的线程程序

c - 在 C 中用指针反转 char 数组

android - android中的球形过滤器