Попытка текстурировать сферу с помощью шейдеров в OpenGL - PullRequest
0 голосов
/ 06 июня 2011

Я изучаю 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();
}

Vertex Shader

#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);
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

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

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

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

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

0 голосов
/ 06 июня 2011

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

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

...