Начал изучать OpenGL, нужна помощь в решении этой проблемы - PullRequest
7 голосов
/ 19 ноября 2010

Итак, я начал изучать 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);
}

Ответы [ 2 ]

6 голосов
/ 19 ноября 2010

Скорее всего, вы определили вершины по часовой стрелке для треугольника, который не отображается, и против часовой стрелки (обычно по умолчанию) для тех, которые есть.Обмотка по часовой стрелке, по существу, создает нормаль, обращенную внутрь, и, таким образом, OpenGL не потрудится отобразить ее при включенном отбраковке.

Самый простой способ проверить это - установить glCullFace(GL_FRONT) - это должно переключать его, чтобы вы могли видетьпропавший треугольник и больше не вижу остальных трех.

6 голосов
/ 19 ноября 2010

Единственное, что я вижу, что влияет на полигоны, это glEnable(GL_CULL_FACE);.
Этого не должно быть, потому что, если вы строите свои вершины в обратном направлении, полигон не будет отображаться.
Удалите его или фактически вызовитеglDisable(GL_CULL_FACE);, чтобы быть уверенным.
В вашем случае маловероятно, что вы хотите нарисовать многоугольник, который вы можете видеть только с одной стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...