c++ - 开始学习 OpenGL,需要帮助解决这个问题

标签 c++ opengl

于是我开始学习OpenGL,阅读了《OpenGL super 圣经5版》这本书。它很好地解释了事情,我已经能够自己创建我的第一个 gl 程序!只是一些简单的东西,一个旋转的 3d 金字塔。

现在由于某种原因,其中一张脸没有渲染。我检查了顶点(首先在纸上绘制),它似乎是正确的。发现如果我更改着色器以绘制循环线,它会渲染。但是它不会呈现三角形。谁能解释一下为什么?

void setupRC()
{
 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

 shaderManager.InitializeStockShaders(); 

 M3DVector3f vVerts1[] = {-0.5f,0.0f,-0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,-0.5f}; 

 M3DVector3f vVerts2[] = {-0.5f,0.0f,-0.5f,0.0f,0.5f,0.0f,-0.5f,0.0f,0.5f}; 
     M3DVector3f vVerts3[] = {-0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,0.5f};  
 M3DVector3f vVerts4[] = {0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,0.5f,0.0f,-0.5f};  



 triangleBatch1.Begin(GL_LINE_LOOP, 3);
 triangleBatch1.CopyVertexData3f(vVerts1); 
 triangleBatch1.End();

 triangleBatch2.Begin(GL_TRIANGLES, 3);
 triangleBatch2.CopyVertexData3f(vVerts2); 
 triangleBatch2.End();
 triangleBatch3.Begin(GL_TRIANGLES, 3);
 triangleBatch3.CopyVertexData3f(vVerts3); 
 triangleBatch3.End();
 triangleBatch4.Begin(GL_TRIANGLES, 3);
 triangleBatch4.CopyVertexData3f(vVerts4); 
 triangleBatch4.End();

 glEnable(GL_CULL_FACE);
}

float rot = 1;

void renderScene()
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

 GLfloat vRed[] = {1.0f, 0.0f, 0.0f, 0.5f};
 GLfloat vBlue[] = {0.0f, 1.0f, 0.0f, 0.5f};
 GLfloat vGreen[] = {0.0f, 0.0f, 1.0f, 0.5f};
 GLfloat vWhite[] = {1.0f, 1.0f, 1.0f, 0.5f};

 M3DMatrix44f transformMatrix;

 if (rot >= 360)
  rot = 0;
 else
  rot = rot + 1;

 m3dRotationMatrix44(transformMatrix,m3dDegToRad(rot),0.0f,1.0f,0.0f); 

 shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vRed);
 triangleBatch1.Draw();
 shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vBlue);
 triangleBatch2.Draw();
 shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vGreen);
 triangleBatch3.Draw();
 shaderManager.UseStockShader(GLT_SHADER_FLAT, transformMatrix, vWhite);
 triangleBatch4.Draw();

 glutSwapBuffers();
 glutPostRedisplay();
 Sleep(10);
}

最佳答案

您很可能已经为未显示的三角形定义了顺时针顺序的顶点,以及为显示的三角形以逆时针顺序(通常是默认顺序)定义的顶点。顺时针缠绕实质上创建了一个向内的法线,因此 OpenGL 不会在启用剔除时费心渲染它。

检查这一点的最简单方法是设置 glCullFace(GL_FRONT)——这应该会切换它,以便您看到丢失的三角形而不再看到其他三个。

关于c++ - 开始学习 OpenGL,需要帮助解决这个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220240/

相关文章:

c++ - Firemonkey:设置 TLabel 文本导致字符串索引超出范围异常

c++ - 在 Qt OpenGL 中制作移动的二维对象

c++ - 满足条件时是否可以在 GLSL 着色器中回调 C/C++ 函数/代码?

c++随机无法解释的错误

c++ - 如何发现板上的 PCIe 总线拓扑和插槽编号?

c++ - 使用 Qt Creator 构建 Stanford CS106B 项目的问题

jquery - 如何从/dev/console上传数据到DataTables插件

OpenGL:立方体内部的照明

c++ - 将 QOpenGLWidget 与 QGraphicsView 一起使用 : viewport not updating?

c++ - 检索图的边