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.