[英]OpenGL gluLookat not working with shaders on
當我要使用gluLookat並在其上具有着色器時,當我關閉着色器時,它不會移動“相機”,它可以正常工作。
我的着色器中是否缺少某些內容,我無法弄清楚。
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.8, 0.8, 0.8, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.5,0,1,0.5,0,0,0,1,0);
glColor3f(0, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDrawArrays(GL_LINES, 6, 6);
glDrawArrays(GL_TRIANGLES, 12,6);
glDrawArrays(GL_LINES, 18, 4);
glDrawArrays(GL_TRIANGLES, 22, 6);
glColor3f(1, 0.7, 0);
glDrawArrays(GL_TRIANGLES, 28, 6);
glFlush();
}
頂點着色器:
#version 450 core // 420, 330 core , compatibility
in vec4 position
out vec4 Color;
void main()
{
gl_Position = position;
}
片段着色器:
#version 450 core // 420, 330 core , compatibility
in vec4 Color;
layout(location=0) out vec4 fColor;
void main()
{
fColor = vec4(0,0,0,0);
}
將“相機”移動到我希望着色器打開的位置
使用着色器程序時,當前矩陣不會神奇地處理頂點坐標屬性。 着色器程序必須執行頂點坐標的轉換。
您有兩種可能性,要么使用兼容性配置文件上下文,要么使用較低的glsl版本(例如1.10)。
然后,您可以使用內置的統一gl_ModelViewProjectionMatrix
(請參閱GLSL 1.10 secification ),固定功能矩陣堆棧將起作用:
#version 110
attribute vec4 position
// varying vec4 Color;
void main()
{
// ...
gl_Position = gl_ModelViewProjectionMatrix * position;
}
但是請注意,此方法自幾十年來就已被棄用。 請參見固定功能管道和舊版OpenGL 。
我建議使用諸如OpenGL Mathematics之類的庫通過lookAt()
和一個統一變量來計算視圖矩陣:
#version 450 core // 420, 330 core , compatibility
in vec4 position
// out vec4 Color;
layout(location = 7) uniform mat4 view_matrix;
void main()
{
gl_Position = view_matrix * position;
}
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
// [...]
{
// [...]
glUseProgram(program);
glm::mat4 view = glm::lookAt(
glm::vec3(0.5f,0.0f,1.0f), glm::Vec3(0.5f,0.0f,0.0f), glm::Vec3(0.0f,1.0f,0.0f));
glUniformMatrix4fv(7, 1, GL_FALSE, glm::value_ptr(view);
// [...]
}
統一位置由Layout限定符明確設置( location = 7
)。
glUniformMatrix4fv
設置默認統一塊中指定位置的統一值。 這必須在glUseProgram安裝了glUseProgram
之后完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.