【问题标题】:Begun learning OpenGL, need help figuring out this problem开始学习OpenGL,需要帮助解决这个问题
【发布时间】:2011-05-12 08:07:12
【问题描述】:

所以我开始学习OpenGL,是从《OpenGL Super Bible 5 ed.》一书中读到的。它很好地解释了事情,我已经能够自己创建我的第一个 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);
}

【问题讨论】:

  • @loncannon;所有的脸都不画吗?还是只是其中的一部分?

标签: c++ opengl


【解决方案1】:

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

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

【讨论】:

  • 你是对的!将红色三角形更改为 {-0.5f,0.0f,-0.5f,0.5f,0.0f,-0.5f,0.0f,0.5f,0.0f} 开始渲染!谢谢!
【解决方案2】:

我在这里看到的唯一影响多边形的是glEnable(GL_CULL_FACE);。
您不应该这样,因为如果您向后绘制顶点,多边形将不会渲染。
删除它或实际致电glDisable(GL_CULL_FACE); 确定。
在您的情况下,您不太可能想要绘制只能从一侧看到的多边形。

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 2011-05-31
    • 2021-11-04
    相关资源
    最近更新 更多