Я пытаюсь применить текстуру к базовому треугольнику в opengl.Проблема в том, что моя текстура не работает, она только применяет странный цвет к треугольнику ...
Я уже посмотрел на документ и некоторые учебные пособия по YouTube, но я действительно не могу заставить его работать.
Вот несколько примеров кода:
Конструктор текстур -
Textures::Textures(const std::string& fileName)
{
int width, height, numComponents;
unsigned char * data = stbi_load(
fileName.c_str()
, &width
, &height
, &numComponents
, 0
);
if (data == NULL)
std::cerr << "Texture loading error: " << fileName << std::endl;
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
if (numComponents == 3)
glTexImage2D(
GL_TEXTURE_2D
, 0
, GL_RGB
, width
, height
, 0
, GL_RGB
, GL_UNSIGNED_BYTE
, data
);
else if(numComponents == 4)
glTexImage2D(
GL_TEXTURE_2D
, 0
, GL_RGBA
, width
, height
, 0
, GL_RGBA
, GL_UNSIGNED_BYTE
, data
);
glBindTexture(GL_TEXTURE_2D, 0);
stbi_image_free(data);
}
Конструктор сетки -
Meshes::Meshes(Vertex* vertices, unsigned int numVertices)
{
m_drawCount = numVertices;
glGenVertexArrays(1, &m_vertexArrayObject);
glBindVertexArray(m_vertexArrayObject);
std::vector<glm::vec3> positions;
std::vector<glm::vec2> texCoord;
positions.reserve(numVertices);
texCoord.reserve(numVertices);
for (unsigned int i = 0; i < numVertices; ++i) {
positions.push_back( *vertices[i].getPos() );
texCoord.push_back( *vertices[i].getTexture() );
}
glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]);
glBufferData(
GL_ARRAY_BUFFER
, positions.size() * sizeof(positions[0])
, &positions[0]
, GL_STATIC_DRAW
);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[TEXTURE_COORD_VB]);
glBufferData(
GL_ARRAY_BUFFER
, texCoord.size() * sizeof(texCoord[0])
, &texCoord[0]
, GL_STATIC_DRAW
);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindVertexArray(0);
}
Фрагмент шейдера -
#version 120
varying out vec4 diffuseColor;
varying vec2 texCoord0;
uniform sampler2D diffuse;
void main()
{
diffuseColor = texture2D(diffuse, texCoord0 );
}
вершина шейдера -
#version 120
attribute vec3 position;
attribute vec2 texCoord;
varying vec2 texCoord0;
void main()
{
gl_Position.xyz = position;
gl_Position.w = 1;
texCoord0 = texCoord;
}
Вот код на github, чтобы вы могли проверить его самостоятельно: https://github.com/Kosta-Git/Pong/tree/master/Pong
Также у меня есть другая проблема, которая заключается в том, что яне могу даже загрузить файл texture.jpg (bricks.jpg работает), но я думаю, это из-за того, что он не 512x512.