Cześć. Mam takie 2 shadery:
#version 330
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 vt;
layout(location = 2) in vec3 normalVector;
uniform mat4 view_matrix;
uniform mat4 perspective_matrix;
uniform mat4 transform;
out vec2 texture_coordinates;
out vec3 vertexColour;
out vec3 vertexToCamera;
out vec3 normalToCamera;
void camera()
{
texture_coordinates = vt;
gl_Position = perspective_matrix * view_matrix * transform * vec4(position, 1.0);
}
void OBJLoader()
{
normalToCamera = vec3(view_matrix * vec4(normalVector, 0.0));
vertexToCamera = vec3(view_matrix * vec4(position, 1.0));
}
void main()
{
OBJLoader();
camera();
}
#version 330
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texture_coord;
layout(location = 2) in vec3 normal_vector;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;
uniform mat4 positionMatrix;
out vec2 coords;
void main()
{
coords = texture_coord;
gl_Position = projection_matrix * view_matrix * positionMatrix * vec4(position, 1.0);
}
Tylko że pierwszy shader w przeciwieństwie do drugiego nie obsługuje wierzchołków które zostały wczytane przez assimp z pliku obj (po prostu nie obiekt się nie rysuje ). Kod rysowania obiektu wygląde tak:
if (Auxiliary::getDistance(Window::camera_position, position, 200))
{
glUniform1i(Slots::colorTextures, 0);
transform = glm::translate(glm::mat4(1.0f), position);
transformRot = glm::rotate(transform, rotation.x, glm::vec3(1, 0, 0));
transformRot = glm::rotate(transformRot, rotation.y, glm::vec3(0, 1, 0));
transformRot = glm::rotate(transformRot, rotation.z, glm::vec3(0, 0, 1));
transformScale = glm::scale(transformRot, scaling);
glUniformMatrix4fv(Slots::transforms, 1, GL_FALSE, glm::value_ptr(transformScale));
glBindVertexArray(vao);
for (unsigned int i = 0; i < startingVertex.size(); ++i)
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[i]);
glDrawArrays(GL_TRIANGLES, startingVertex[i], verticesCount[i]);
}
Shaders::setUniform(Slots::colour, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));
}
pierwszy if sprawdza czy nie jesteśmy za daleko.