#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, поскольку они влияют на текущую программу.