Как передать переменную текстуры GLuint (фактическую текстуру, загруженную из изображения) в скрипты шейдеров?Например, как связать текстуру GLuint с однородной текстурой sampler2D?Может быть, я просто не понимаю, что я уже сделал это.
Это привязывает текстуру к единице текстуры 0:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
Это недопустимо, потому что texture
не является единым местоположением, поэтому удалите эту строку:
glUniform1i(texture, 0); // <-- invalid
Это также недопустимо, потому что униформа texture
должна быть установлена на номер единицы текстуры:
program.setUniformValue("texture", texture); // <-- invalid
Поэтому замените ее на:
program.setUniformValue("texture", 0); // <-- sampler2D texture uses GL_TEXTURE0
Примечание: здесь я предполагаю, что setUniformValue
работает правильно.
В чем разница между атрибутом vec4 vertexColorIn и однородной текстурой sampler2D?Я думаю, что цвет исходит от текстуры.
vertexColorIn
исходит из VAO и отличается для каждой вершины.texture
- это сэмплер, который выбирает текстуру, привязанную к единице текстуры, которую вы установили выше.
В вашем коде вам не нужен цвет вершины, но вам нужны координаты текстуры.Таким образом, ваши шейдеры должны выглядеть так:
const char* vertextShader = STR(
attribute vec4 position;
attribute vec4 texcoordIn;
varying vec4 texcoordOut;
void main(void)
{
gl_Position = position;
texcoordOut = texcoordIn;
}
);
const char* fragmentShader = STR(
varying vec4 texcoordOut;
uniform sampler2D texture;
void main(void)
{
gl_FragColor = texture2D(texture, texcoordOut);
}
);
Могу ли я использовать glTexCoord2f () и glVertex2f () вместо glVertexAttribPointer () и glVertexAttribPointer ()?Это потому, что они кажутся мне лучше.
glTexCoord2f
и glVertex2f
- это устаревшие функции, которые были удалены в OpenGL 3 и доступны только в профиле совместимости.Вы не должны их использовать.
Эти строки находятся не в том месте:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Они должны идти после того, как вы связали текстуру:
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, img_data);
// sets the filtering for the bound texture:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Поскольку вопрос помечен opengl-4 : вам не нужно задавать униформу в этом случае.Вы можете указать расположение и привязки непосредственно в шейдерах:
const char* vertextShader =
"#version 450 core\n" STR(
layout(location = 0) in vec4 position;
layout(location = 1) in vec4 texcoordIn;
layout(location = 0) out vec4 texcoordOut;
void main(void)
{
gl_Position = position;
texcoordOut = texcoordIn;
}
);
const char* fragmentShader =
"#version 450 core\n" STR(
layout(location = 0) in vec4 texcoord;
layout(binding = 0) uniform sampler2D TEX;
layout(location = 0) out vec4 OUT;
void main(void)
{
OUT = texture(TEX, texcoord);
}
);