Попытка текстурировать сферу с помощью шейдеров в OpenGL

#c #opengl #shader

#c #opengl #шейдер

Вопрос:

Я изучаю OpenGL по книге OpenGL SuperBible. Я пытаюсь отобразить сферу, созданную с помощью функции gltMakeSphere(). Я привязываю текстуру и запускаю useProgram(). Шейдеры работают с треугольником, используя GLBatch, но сфера окрашена просто в зеленый цвет.

Вот код:

 void RenderScene(void)
{
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

     modelViewMatrix.PushMatrix();

     modelViewMatrix.Translate(0,0,-5.0f);
     GLint locMVP = glGetUniformLocation(testShader, "mvpMatrix");
     glBindTexture(GL_TEXTURE_2D, texture1ID);
     glUniformMatrix4fv(locMVP, 1, GL_FALSE,
         transformPipeline.GetModelViewProjectionMatrix()); 
     glUseProgram(testShader);
     testBatch.Draw();
     sphereObject.Draw();   
     glutSwapBuffers();
     glutPostRedisplay();
     modelViewMatrix.PopMatrix();
}
  

Вершинный шейдер

 #version 130

in vec4 vVertex;
in vec2 vTexCoords;

smooth out vec2 vVaryingTexCoords;

void main(void) 
{ 
vVaryingTexCoords = vTexCoords;
gl_Position = vVertex;
}
  

Фрагмент шейдера

 #version 130


uniform sampler2D colorMap;

out vec4 vFragColor;
smooth in vec2 vVaryingTexCoords;


void main(void)
{ 
    vFragColor = texture(colorMap, vVaryingTexCoords.st);
}
  

Ответ №1:

Единственное, что мне приходит в голову, это то, что вы неправильно задали здесь координаты текстуры :
sphereObject.Draw();

Попробуйте отрисовывать сферу с меньшей точностью (меньше полигонов) и посмотрите, получится ли текстура

Комментарии:

1. функция Draw() встроена в класс GLTriangleBatch, созданный не мной.

Ответ №2:

Один из способов убедиться, что ваши координаты текстуры верны (или, по крайней мере, изменяются на пиксель вместо постоянного цвета по всей сфере), — это изменить ваш фрагментный шейдер, чтобы выводить координату текстуры в виде цвета.

 #version 130
uniform sampler2D colorMap;
out vec4 vFragColor
smooth in vec2 vVaryingTexCoords;
void main(void)
{
    vFragColor = vec4(vVaryingTexCoords, 0.0f, 1.0f);
}
  

Если ваша сфера нарисована постоянным цветом с помощью этого шейдера, значит, что-то не так с вашими текстурными координатами.

Кроме того, убедитесь, что вы вызываете любые функции glUniform * ПОСЛЕ вызова glUseProgram, поскольку они влияют на текущую программу.