OpenGL呈现三角形而不是Quad
OpenGL renders triangle instead of quad
我当前正在尝试将纹理呈现为全屏QWindow
(QT 5.9.1)。
由于纹理都是黑色的,我想确保通过告诉碎片着色器将所有像素呈现为红色,但显然在这里发生了一个错误。
我不是四边形,我在屏幕的左上角得到一个红色的三角形。
我看不到我用代码犯的错误,所以我要求您查看我的代码。
同样,即使我使用glTexImage2D
上传的纹理看起来不错,并且glGetError
中没有错误。
,也可能仅获得黑色纹理。
预先感谢。
OpenGL上下文和Qwindow的初始化:
int i;
for( i=0;i<QApplication::screens().size();i++ )
{
if(QApplication::screens().at(i)->name().compare(szScreenName)==0)
break;
}
if(i==QApplication::screens().size())
i--;
setGeometry(QApplication::screens().at(i)->availableGeometry());
showFullScreen();
setSurfaceType(QWindow::OpenGLSurface);
QSurfaceFormat fmt;
fmt.setSwapBehavior(QSurfaceFormat::SingleBuffer);
fmt.setRenderableType(QSurfaceFormat::OpenGLES);
setFormat(fmt);
_pContext = new QOpenGLContext(this);
_pContext->setFormat(fmt);
//_pContext->setShareContext(QOpenGLContext::globalShareContext());
_pContext->create();
QObject::connect( this, &DLP::postRenderSignal, this, &DLP::render );
_pContext->makeCurrent(this);
initializeOpenGLFunctions();
//_pTexManager = new TextureManager(QOpenGLContext::globalShareContext()->functions());
_pTexManager = new TextureManager(this);
char* szVertexShader = "#version 110n"
"attribute vec4 a_Position;n"
"attribute vec2 a_TexCoord;n"
"varying vec2 v_TexCoord;n"
"void main()n"
"{n"
" gl_Position = a_Position;n"
" v_TexCoord = a_TexCoord;n"
"}n";
char* szFragmentShader = "#version 110n"
"precision mediump float;n"
"varying vec2 v_TexCoord;n"
"uniform sampler2D u_Texture;n"
"void main()n"
"{n"
" gl_FragColor = vec4(1.0,0.0,0.0,1.0);//texture2D( u_Texture, v_TexCoord );n"
"}n";
//_nProgram = linkShader(QOpenGLContext::globalShareContext()->functions(), szVertexShader, szFragmentShader);
_nProgram = linkShader(this, szVertexShader, szFragmentShader);
if(_nProgram!=0)
{
_nShaderSamplerLoc = glGetUniformLocation(_nProgram,"u_Texture");
_nShaderTextureLoc = glGetAttribLocation(_nProgram,"a_TexCoord");
_nShaderPositionLoc = glGetAttribLocation(_nProgram,"a_Position");
}
glGenBuffers(2, _pBuffers );
static const unsigned short pIndexData[] = { 0, 1, 2, 3 };
glBindBuffer(GL_ARRAY_BUFFER, _pBuffers[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(pIndexData), pIndexData, GL_STATIC_DRAW);
static const float pPosBuffer[20] = {
-1, 1, 0, 0, 0,
1, 1, 0, 1, 0,
-1, -1, 0, 0, 1,
1 -1, 0, 1, 1,
};
glBindBuffer(GL_ARRAY_BUFFER, _pBuffers[0]);
glBufferData(GL_ARRAY_BUFFER, 20*4, pPosBuffer, GL_STATIC_DRAW);
渲染代码(DLP :: Render):
if (!isExposed() || !_pContext)
return;
_pContext->makeCurrent(this);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glViewport(0,0,m_nWidth,m_nHeight);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glUseProgram(_nProgram);
glBindBuffer(GL_ARRAY_BUFFER, _pBuffers[0]);
// Load the vertex position
glVertexAttribPointer(_nShaderPositionLoc, 3, GL_FLOAT, false, 5 * 4, (void*)0);
glEnableVertexAttribArray(_nShaderPositionLoc);
// Load the texture coordinate
//glVertexAttribPointer(_nShaderTextureLoc, 2, GL_FLOAT, false, 5 * 4, (void*)(3 * 4));
//glEnableVertexAttribArray(_nShaderTextureLoc);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _pTexManager->getTexture(key));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUniform1i(_nShaderSamplerLoc, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _pBuffers[1]);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(_nShaderPositionLoc);
//glDisableVertexAttribArray(_nShaderTextureLoc);
glFinish();
_pContext->swapBuffers(this);
编辑:
此外,只有当我在QT中具有多个OpenGL上下文时才发生,例如4 FrameBuffer对象,QML场景图和此Qwindow,因此QT处理OpenGL上下文的问题可能是一个问题。
好的,问题是解决的:
显然,我的纹理数据确实有一些问题,这些数据确实具有奇怪的alpha数据,因此启用了混合功能,它不会呈现纹理。同样,矩形未正确渲染的原因是其中一个indeces中的符号错误。
顺便说一句:VOGL是一个非常有用的工具,可以查看OpenGL statemachine进行调试应用程序。
相关文章:
- 绘制旋转的三角形
- 如何用for循环在c++中生成单词三角形
- 如何使用递归打印修改后的星号三角形图案
- C++ 创建带有 for 循环的三角形
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Eigen c++ 三角形来自
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用对象文件读取三角形数据网格
- 从捕获的帧中裁剪三角形 - OpenCV 和 C++
- 如何从 3D 曲面网格中删除自相交三角形?
- 以C++输出一个数字三角形
- 打印对立三角形在C++中起作用
- 确定C++中的等腰直角三角形
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- OpenGL绘制三角形而不是正方形
- 将数字表示为两个三角形数字的总和
- OpenGL程序不显示三角形
- OpenGL呈现三角形而不是Quad