【发布时间】:2017-10-19 08:23:00
【问题描述】:
我是 OpenGL ES 的半新手,看起来我缺少一个基本概念。 我在我的代码中使用了一些 QT 类,但它接近普通的 OpenGL ES。
我想为每个渲染帧执行以下操作:
- 渲染一个基于TRIANLGE_STRIP 且带有纹理的简单全屏矩形。您可以将其视为背景图像。这已经可以自己运行了。一个自己的顶点和片段着色器(由 QOpenGLShaderProgram 包装)用于渲染它。纹理最初来自 QOpenGLFramebufferObject,它本身有时会重新渲染,但不是每一帧。
- 在 (1.) 中绘制 TRIANGLE_STRIP 后,我想在顶部渲染另一个基本形状。目前底部还有一个小矩形。这使用了另一个顶点和框架着色器。这部分也可以单独工作。
我的问题是:这两个步骤一起不起作用。我只看到 (2.) 中屏幕底部的小矩形,但纹理消失了。应该显示纹理的区域用透明颜色填充。
我的假设是,两个框架着色器以某种方式相互冲突,或者我完全错过了状态的一些东西.. 我很高兴能提示这里缺少的内容。
提前致谢!
这是我的一些代码:
这是步骤(1)的顶点和帧着色器代码:
static const char* vertexShaderSource =
"attribute highp vec4 triangleCoords;\n"
"attribute lowp vec2 textureCoords;\n"
"varying lowp vec2 v_textureCoords;\n"
"void main() {\n"
" v_textureCoords = textureCoords;\n"
" gl_Position = triangleCoords;\n"
"}\n";
static const char* fragmentShaderSource =
"varying lowp vec2 v_textureCoords;\n"
"uniform sampler2D sampler;\n"
"void main() {\n"
" gl_FragColor = vec4(texture2D(sampler, v_textureCoords).rgb, 1.0);\n"
"}\n";
m_textureProgram = new QOpenGLShaderProgram();
m_textureProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
m_textureProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
这是步骤(2)的顶点和帧着色器代码:
static const char* vertexShaderSource =
"attribute highp vec4 position;\n"
"uniform lowp vec4 color;\n"
"void main() {\n"
" gl_Position = position;\n"
"}\n";
static const char* fragmentShaderSource =
"uniform lowp vec4 color;\n"
"void main() {\n"
" gl_FragColor = color;\n"
"}\n";
m_shapeProgram->addShaderFromSourceCode( QOpenGLShader::Vertex, vertexShaderSource );
m_shapeProgram->addShaderFromSourceCode( QOpenGLShader::Fragment, fragmentShaderSource );
还有主要的渲染功能,稍微精简了一点(我跳过了初始化部分,其中设置了着色器程序并绑定了属性位置):
m_context->makeCurrent(w);
glClear( GL_COLOR_BUFFER_BIT );
// Step (1.) begins here
m_textureProgram->bind();
glBindTexture(GL_TEXTURE_2D, textureId);
m_textureProgram->enableAttributeArray( LocationTriangleTextureCoords );
m_textureProgram->enableAttributeArray( LocationTextureCoords );
m_textureProgram->setAttributeArray( LocationTriangleTextureCoords, GL_FLOAT, s_triangleStripCoords, 2 );
m_textureProgram->setAttributeArray( LocationTextureCoords, GL_FLOAT, s_textureCoords, 2);
f.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
m_textureProgram->disableAttributeArray( LocationTriangleTextureCoords );
m_textureProgram->disableAttributeArray( LocationTextureCoords );
m_textureProgram->release();
// Step (2.) begins here:
m_shapeProgram->bind();
m_shapeProgram->setUniformValue( m_colorUniformId, m_color1 );
QPointF p0( -1, -0.7);
QPointF p1( -1, -1.0 );
QPointF p2( 0, -1.0 );
QPointF p3( 0, -0.7 );
GLfloat vertices[12] = { GLfloat(p0.x()), GLfloat(p0.y()),
GLfloat(p1.x()), GLfloat(p1.y()),
GLfloat(p2.x()), GLfloat(p2.y()),
GLfloat(p0.x()), GLfloat(p0.y()),
GLfloat(p3.x()), GLfloat(p3.y()),
GLfloat(p2.x()), GLfloat(p2.y())
};
m_buffer->bind();
m_buffer->write( 0, vertices, sizeof(vertices) );
m_shapeProgram->setAttributeBuffer( LocationShapePosition, GL_FLOAT, 0, 2 );
m_shapeProgram->enableAttributeArray( LocationShapePosition );
f.glDrawArrays( GL_TRIANGLES, 0, 6 );
m_shapeProgram->release();
// Done frame.
m_context->swapBuffers(w);
【问题讨论】: