Модель исчезнет при добавлении новой текстуры opengl

Я попытался загрузить ту же модель (смоделированную в 3Ds max) в opengl, но с разными текстурами. Проблема в том, что когда я пытаюсь связать текстуру с помощью glBindTexture после того, как я активировал текстуру, она исчезает. До того, как я изменил текстуры в 3Ds max, он всегда показывал мне модель в черном цвете (только в opengl). Но я даже не назначил черный цвет своей модели. Мое изображение «model-image.png» также содержит все текстуры, которые я назначил моему объекту. Так я что-то упустил?
Заранее благодарны за Вашу помощь.

void initDrawing()
{
glEnable(GL_DEPTH_TEST);
program = glCreateProgram();
std::string shaderV = Utilities::loadFile("shader.vert");
std::string shaderF = Utilities::loadFile("shader.frag");
program = Utilities::compileShader(shaderV, shaderF);
Utilities::loadObj("model.obj", obj);
Utilities::loadPNG("model-image.png", diffuse);

glEnable(GL_TEXTURE_2D);
glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);

glGenBuffers(1, &vPosition);
glBindBuffer(GL_ARRAY_BUFFER, vPosition);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec4)*obj.vertices.size(), &obj.vertices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vPosition);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

GLuint vCoordinates;
glGenBuffers(1, &vCoordinates);
glBindBuffer(GL_ARRAY_BUFFER, vCoordinates);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec2)*obj.textureCoordinates.size(), &obj.textureCoordinates[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, vCoordinates);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);

glGenTextures(2, &texture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, diffuse.width, diffuse.height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
&diffuse.colors[0]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glUseProgram(program);

ModelView = glGetUniformLocation(program, "ModelView");
Projection = glGetUniformLocation(program, "Projection");
Diffuse = glGetUniformLocation(program, "Diffuse");
}
void display()
{

// background color
const GLfloat color[] = { 0.5, 0.5, 0.5, 1 };
glClear(GL_DEPTH_BUFFER_BIT);
glClearBufferfv(GL_COLOR, 0, color);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
modelView = view * model;
glUniformMatrix4fv(ModelView, 1, GL_FALSE, glm::value_ptr(modelView));
glUniformMatrix4fv(Projection, 1, GL_FALSE, glm::value_ptr(projection));
glUniform1i(Diffuse, 0);
glDrawArrays(GL_TRIANGLES, 0, obj.vertices.size());

glutSwapBuffers();
}

Мой шейдер:

фрагментный шейдер:

uniform sampler2D Diffuse;

in vec2 fUV;
out vec3 color;

//main for the color
void main(void)
{
color = texture(Diffuse, fUV).rgb;
}

вершинный шейдер:

layout (location = 0) in vec4 vPosition;
layout (location = 2) in vec2 vCoordinates;

uniform mat4 ModelView;
uniform mat4 Projection;

out vec2 fUV;

void main(void)
{
gl_Position = Projection * ModelView * vPosition;
fUV = vCoordinates;
}

-2

Решение

Я думаю, что когда вы говорите,

layout(location = 2) in vec2 vCoordinates;

ты действительно хочешь сказать

layout(location = 1) in vec2 vCoordinates;

учитывая, что вы никогда не включаете атрибут вершины 2.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector