Я пытаюсь показать текстуру (да, это банк) с opengl 2.1 и glsl 120, но я не уверен, как это сделать, все, что я могу получить, это черный квад, Я после этого руководства: A Textured Cube, OpenGl - Textures и то, что я понял, что мне нужно:opengl 2.1 и текстуры
- Укажите координаты текстуры, чтобы прикрепить к каждой вершине (в моем случае 6 вершин, куб без индексации)
- Загрузить текстуру и связать его в блоке текстуры (по умолчанию 0)
glDrawArrays вызовов
Внутри шейдеров мне нужно:
- Получите текстурные COORDS в атрибуте в вершинном шейдере и передать его в пиксельный шейдер через меняющегося переменной
- В пиксельный шейдер использовать объект сэмплера образца пиксель в позиции, заданной переменной переменной, из текстуры.
Все ли верно?
Вот как я создать текстуру VBO и загрузить текстуру:
void Application::onStart(){
unsigned int format;
SDL_Surface* img;
float quadCoords[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f};
const float texCoords[] = {
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f,
1.0f, 1.0f,
0.0f, 1.0f,
0.0f, 0.0f};
//shader loading omitted ...
sprogram.bind(); // call glUseProgram(programId)
//set the sampler value to 0 -> use texture unit 0
sprogram.loadValue(sprogram.getUniformLocation(SAMPLER), 0);
//quad
glGenBuffers(1, &quadBuffer);
glBindBuffer(GL_ARRAY_BUFFER, quadBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*18, quadCoords, GL_STATIC_DRAW);
//texture
glGenBuffers(1, &textureBuffer);
glBindBuffer(GL_ARRAY_BUFFER, textureBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*12, texCoords, GL_STATIC_DRAW);
//load texture
img = IMG_Load("resources/images/crate.jpg");
if(img == nullptr)
throw std::runtime_error(SDL_GetError());
glGenTextures(1, &this->texture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, this->texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->w, img->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, img->pixels);
SDL_FreeSurface(img);
}
рендеринга фазы:
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(COORDS);
glBindBuffer(GL_ARRAY_BUFFER, quadBuffer);
glVertexAttribPointer(COORDS, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(TEX_COORDS);
glBindBuffer(GL_ARRAY_BUFFER, textureBuffer);
glVertexAttribPointer(TEX_COORDS, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
//draw the vertices
glDrawArrays(GL_TRIANGLES, 0, 6);
вершинные шейдеры:
#version 120
attribute vec3 coord;
attribute vec2 texCoord;
varying vec2 UV;
void main(){
gl_Position = vec4(coord.x, coord.y, coord.z, 1.0);
UV = texCoord;
}
пиксельный шейдер:
#version 120
uniform sampler2D tex;
varying vec2 UV;
void main(){
gl_FragColor.rgb = texture2D(tex, UV).rgb;
gl_FragColor.a = 1.0;
}
Я знаю, что учебники использовать out
вместо varying
так я пытался «преобразовать» код, также есть этот учебник: Simple Texture - LightHouse что объяснить gl_MultiTexCoord0
атрибут и gl_TexCoord
массив которым строятся, но это почти то же самое я делаю. Я хочу знать, если все будет хорошо, а если нет, я хотел бы узнать, как показать простую текстуру 2d на экране с opengl 2.1 и glsl 120
Где вы привязываете текстуру к сэмплеру? – immibis
Редактировать в [mcve]. – genpfault
@immibis, перед привязкой моей текстуры я вызываю 'glActiveTexture (GL_TEXTURE0)', который является сэмплером по умолчанию в шейдерах –