Я использую SOIL для загрузки текстур и пытаюсь «отобразить» их в треугольнике с помощью OpenGL 3.2. У меня проблема, хотя: ничего не появляется.
Это мой код:
#include <iostream>
#include "GL/SOIL.h"
#include "math/vec3.hpp"#include "math/mat3.hpp"#include "setup.hpp"#include "graphics/Shader.hpp"#include "graphics/Texture.hpp"
int main()
{
if(!setup::initOpenGL())
return -1;
if(!setup::openWindow("Testing", 800, 600))
return -1;
GLfloat vertices[] =
{
0.0f, 0.5f, -1.0f,
0.5f, -0.5f, -1.0f,
-0.5f, -0.5f, -1.0f
};
GLfloat UV[] =
{
0.5f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f
};
Shader shader("", "");
shader.compile("#version 330\nlayout(location = 0) in vec3 vertexPosition_modelspace;\nlayout(location = 1) in vec2 vertexUV;\nout vec2 UV;\nvoid main() { gl_Position.xyz = vertexPosition_modelspace;gl_Position.w = 1.0;\nUV = vertexUV; }",
"#version 330 core\nout vec3 color;\nin vec2 UV;\nuniform sampler2D tex_sampler;\nvoid main() { color = texture(tex_sampler, UV).rgb; }");
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint texbuffer;
glGenBuffers(1, &texbuffer);
glBindBuffer(GL_ARRAY_BUFFER, texbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(UV), UV, GL_STATIC_DRAW);GLuint _tex = SOIL_load_OGL_texture("test.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_MIPMAPS);
std::cout << "tex = " << _tex << std::endl;
glBindTexture(GL_TEXTURE_2D, _tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
do
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
shader.bind();
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);
glBindBuffer(GL_ARRAY_BUFFER, texbuffer);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*) 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _tex);
glUniform1i(glGetUniformLocation(shader.getID(), "tex_sampler"), 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
shader.unbind();
glfwSwapBuffers();
} while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && glfwGetWindowParam(GLFW_OPENED));
setup::done();
return 0;
}
И читаемая версия шейдеров:
// Vertex shader:
#version 330
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;
out vec2 UV;
void main()
{
gl_Position.xyz = vertexPosition_modelspace;
gl_Position.w = 1.0;
UV = vertexUV;
}
////////////////////
// Fragment shader:
#version 330 core
out vec3 color;
in vec2 UV;
uniform sampler2D tex_sampler;
void main()
{
color = texture(tex_sampler, UV).rgb;
}
Когда этот код используется, ничего не появляется. Но когда я использую постоянный цвет в фрагменте шейдера, как color = vec3(1.0, 0.0, 0.0);
работает отлично.
Задача ещё не решена.
Других решений пока нет …