我在C++ OpengL程序和GLSL頂點和片段着色器上工作。從GLSL着色器直接位置計算轉換mattrix
我正在創建同一個對象的幾個實例。我只需要改變實例之間的對象位置。
這是我所做的:我正在使用一個統一的變量,這是一個變換矩陣的數組。每個矩陣代表一個對象實例。
MVP也是一個變換矩陣,但MVP是由相機的位置,方向和屬性設置的。
這裏是我的頂點着色器:
#version 330 core
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;
uniform mat4 object_positions[20];
out vec3 fragment_color;
uniform mat4 MVP;
void main()
{
gl_Position = object_positions[gl_InstanceID] * MVP * vec4(vertex_position,1.0);
fragment_color = vertex_color;
}
以下是我在C++程序做設置目標位置:
glm::mat4 object_positions[20];
object_positions[0] = glm::translate(glm::mat4(1), glm::vec3(0.4f,0.2f,0.0f));
object_positions[1] = glm::translate(glm::mat4(1), glm::vec3(0.5f,1.4f,0.0f));
...
object_positions[19] = glm::translate(glm::mat4(1), glm::vec3(-10.6f,0.2f,0.0f));
GLuint object_positions_id = glGetUniformLocation(program_id, "object_positions");
...
glUniformMatrix4fv(object_positions_id, 7, GL_FALSE, glm::value_ptr(object_positions[0]));
您認爲GLM的第二個參數的VEC 3 :: translate包含每個對象的位置。 在這一點上,每件事情都很好。
我想要做的是在着色器中計算glm :: translte。我其實想要的是發送一個vec3而不是每個位置的mat4。我希望GPU能夠計算轉換矩陣而不是CPU。我試過的所有東西都不起作用。
由於
不,它不工作。這是完全一樣的結果。 object_positions在這種情況下應該是一個轉換矩陣,而不是一個位置 – Bob5421
爲什麼只需要添加偏移量時需要一個矩陣更簡單快捷? –
是的,這是一個好主意,但我應該把什麼w? – Bob5421