Opengl Vertex Shader设置每个顶点的布尔值(glVertexAttribPointer)

时间:2016-04-19 11:21:55

标签: c++ opengl qt-creator

问题:我有一个包含结构数组(MyStruct)的VBO,它包含一个布尔属性。我想将此布尔值传递给我的顶点着色器,但根据GL_BOOL的文档不允许glVertexAttribPointer(...);

  

指定数组中每个组件的数据类型。象征性的   常量GL_BYTE,GL_UNSIGNED_BYTE,GL_SHORT,GL_UNSIGNED_SHORT,   glVertexAttribPointer和GL_INT接受GL_INT和GL_UNSIGNED_INT   glVertexAttribIPointer。另外GL_HALF_FLOAT,GL_FLOAT,   GL_DOUBLE,GL_FIXED,GL_INT_2_10_10_10_REV,   GL_UNSIGNED_INT_2_10_10_10_REV和GL_UNSIGNED_INT_10F_11F_11F_REV是   被glVertexAttribPointer接受。 GL_DOUBLE也被接受   glVertexAttribLPointer是该类型接受的唯一标记   该函数的参数。初始值为GL_FLOAT。   资料来源:https://www.opengl.org/sdk/docs/man/html/glVertexAttribPointer.xhtml

我尝试了什么:如moc-up中所示,我尝试使用in int myBoolean;而不是结构的布尔值(设置正确,我是' ve (未检查)未正确映射到顶点着色器中的整数(虽然这可能是我的最终结果?)。

问题的复制代码:

MYSTRUCT

struct MyStruct{
 ...
 bool myBoolean;
 ...
}

顶点着色器

#version 400 compatibility // Can be set higher if needed
in vec3 position;
//in bool  myBoolean;
//in int myBoolean; -> doesn't work either

out vec4 color;

void main( void )
{
 //if (myBoolean){ // (myBool == 1) for the int
 // color = vec4(1,0,0,1);
 //} else {
 color = vec4(position, 1);
 //}
 ...
};

我如何设置缓冲区:

    // Build OpenGL VBO
    glGenBuffers( 1, &m_glVBO );
    glBindBuffer( GL_ARRAY_BUFFER, m_glVBO );
    glBufferData( GL_ARRAY_BUFFER, numOfMyStructs*sizeof(MyStruct), myStructs, GL_DYNAMIC_DRAW );

    // Build OpenGL VAO
    glGenVertexArrays( 1, &m_glVAO );
    glBindVertexArray( m_glVAO );

    // Position attribute
    glEnableVertexAttribArray( 0 );
    glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, sizeof(myStruct), (GLvoid*)offsetof(MyStruct, position) );

    // Does not work, all booleans in the vertex buffer are false
    // and GL_BOOL is not allowed.
    //glEnableVertexAttribArray( 1 );
    //glVertexAttribPointer( 1, 1, GL_INT, GL_FALSE, sizeof(MyStruct), (GLvoid*)offsetof(MyStruct, myBoolean) );

    glBindVertexArray( 0 );
    glBindBuffer( GL_ARRAY_BUFFER, 0 );

绑定着色器:

myShader = new QGLShaderProgram( QGLContext::currentContext() );
...
myShader->bindAttributeLocation( "position", 0 );
//myShader->bindAttributeLocation( "myBoolean", 1);
glBindFragDataLocation( myShader->programId(), 0, "color" );
...

渲染:(我希望将来使用实例渲染(球体),但这并不重要)

...
glEnable( GL_POINT_SMOOTH );
glHint( GL_POINT_SMOOTH_HINT, GL_NICEST );

glBindVertexArray( m_glVAO );
glDrawArrays( GL_POINTS, 0, numMyStructs );
glBindVertexArray( 0 );
... 

补充信息:我使用QtCreator(3.6.1),C ++ 11,OpenGL(4.5),GLM(0.9.7.4),GLEW(1.13),Nvidia卡(364.16驱动程序) + CUDA 7.5),Linux 64位。 我是一名OpenGL新手。 如果可能,我宁愿不使用其他库。 没有myBoolean就可以正常工作(所以使用moc-up代码中设置的注释部分)。 moc-up代码可以快速输入stackoverflow,我对可能的语法错误表示道歉,可以随意指出它们(现实代码在没有myBoolean的情况下工作)。如果需要,我可以提供其他信息。

提前致谢。

1 个答案:

答案 0 :(得分:1)

你可能想要glVertexAttribIPointer(注意那里的'I'字母) - 那就是传递积分值。而且由于结构中的所有东西都至少是字节对齐的,所以单个bool不能小一些比GL_UNSIGNED_BYTE

XMLHttpRequest