这是我的问题,任何人都可以帮助我吗?
我正在尝试使用QOpenGLWidget来渲染一个简单的例子,一个三角形。但问题是小部件是完全黑色的,不能渲染任何东西。
在main.cpp中:
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QSurfaceFormat format;
format.setProfile (QSurfaceFormat::CoreProfile);
format.setVersion (4 , 3);
format.setSwapBehavior (QSurfaceFormat::DoubleBuffer);
format.setRenderableType (QSurfaceFormat::OpenGL);
QSurfaceFormat::setDefaultFormat (format);
MyViewer.show();
return app.exec();
}
在MyViewer.cpp中:
namespace {
static const char VertexShaderCode[] =
"#version 410\n"
"layout(location=0) in vec2 position;"
"layout(location=1) in vec3 color;"
""
""
"void main()"
"{"
" gl_Position = vec4(position, 0.0, 1.0);"
"}\0";
static const char FragmentShaderCode[] =
"#version 410\n"
""
"out vec4 output_color;"
""
"void main()"
"{"
" output_color = vec4(1.0, 0.0, 0.0, 1.0);"
"}\0";
void InstallShaders () {
QOpenGLShader vertex_shader (QOpenGLShader::Vertex , 0);
QOpenGLShader fragment_shader (QOpenGLShader::Fragment , 0);
vertex_shader.compileSourceCode (::VertexShaderCode);
fragment_shader.compileSourceCode (::FragmentShaderCode);
assert(vertex_shader.isCompiled () and fragment_shader.isCompiled ());
QOpenGLShaderProgram program;
program.addShader (& vertex_shader);
program.addShader (& fragment_shader);
program.link ();
assert(program.isLinked ());
assert(program.bind ());
// glUseProgram (program.programId ());
}
};
...
void MyViewer::InitializeGL() {
initializeOpenGLFunctions();
InistallShaders();
GLuint buffer_id;
glGenBuffers (1 , & buffer_id);
glBindBuffer (GL_ARRAY_BUFFER , buffer_id);
GLfloat vertices[] = {
+0.0f , +0.8f , // top
+1.0f , +0.0f , +0.0f , // red
-0.8f , -0.8f , // left
+0.0f , +1.0f , +0.0f , // blue
+0.8f , -0.8f , // right
+0.0f , +0.0f , +1.0f , // green
};
glBufferData (GL_ARRAY_BUFFER , sizeof (vertices) , vertices , GL_STATIC_DRAW);
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);
glVertexAttribPointer (0 , 2 , GL_FLOAT , GL_FALSE , sizeof (float) * 5 , 0);
glVertexAttribPointer (1 , 3 , GL_FLOAT , GL_FALSE , sizeof (float) * 5 , (char *) (sizeof (float) * 2));
}
void MyViewer::paintGL () {
glDrawArrays (GL_TRIANGLES , 0 , 3);
}
但没有渲染,我只有一个黑色的窗口。
我尝试渲染没有着色器的三角形,然后删除
glVertexAttribPointer(1);
和
glVertexAttribPointer (1 , 3 , GL_FLOAT , GL_FALSE , sizeof (float) * 5 , (char *) (sizeof (float) * 2));
为了在黑色平面上渲染一个白色三角形,但它也不起作用。顺便说一下,构建和所有assert(...)
都成功了,我认为着色器编译工作正常。