OpenGL相机移动程序顶点着色器问题
Posted
技术标签:
【中文标题】OpenGL相机移动程序顶点着色器问题【英文标题】:OpenGL camera movement program vertex shader issue 【发布时间】:2020-05-23 12:00:48 【问题描述】:所以,我是一名初学者学习图形程序员。我正在开发一个相机移动程序。我认为顶点着色器有问题。程序运行没有错误,但屏幕完全空白。这是我正在使用的顶点着色器:
#version 330
in vec4 vPosition;
out vec4 vColor;
uniform mat4 model_view;
uniform mat4 projection;
void main()
vec4 pos = projection * model_view * vPosition / vPosition.w;
gl_Position = pos;
vColor = vPosition;
如果我将着色器切换回基本版本:
#version 330
in vec4 vPosition;
out vec4 vColor;
void
main()
gl_Position = vPosition;
vColor = vPosition;
程序成功运行并渲染了一个三角形。所以,我很确定错误出在着色器上。
在初始化函数中调用着色器:
void initialize(void)
glClearColor(1.0, 1.0, 1.0, 1.0); // white background
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Create and initialize a buffer object
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
// Load shaders and use the resulting shader program
GLuint program = InitShader("res/shaders/vshader21.glsl", "res/shaders/fshader21.glsl");
model_view = glGetUniformLocation(program, "model_view");
projection = glGetUniformLocation(program, "projection");
glUseProgram(program);
// Initialize the vertex position attribute from the vertex shader
GLuint loc = glGetAttribLocation(program, "vPosition");
glEnableVertexAttribArray(loc);
glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glBufferData 中的“点”如下:
const int WIDTH = 500, HEIGHT = 500;
/* Positions */
vec4 points[] =
vec4(0.5,0.5, 1, 1),
vec4(-0.5,0.5, 1, 1),
vec4(0.5,-0.5, 1, 1) ,
vec4(-0.5,-0.5, 1, 1)
;
model_view 和 projection 在主应用程序和全局中是 GLuint 类型。
我在显示函数中设置了统一变量(位置、模型视图)。
void display(void)
glClear(GL_COLOR_BUFFER_BIT); // clear the window
glPointSize(20.0);
// Projection transformation parameters
GLfloat left = -1.0, right = 1.0;
GLfloat bottom = -1.0, top = 1.0;
GLfloat zNear = 0, zFar = 3.0;
mat4 p = Ortho(left, right, bottom, top, zNear, zFar);
glUniformMatrix4fv(projection, 1, GL_TRUE, p);
vec4 eye(0.0, 0.0, -1.0, 1.0);
vec4 at(0.0, 0.0, 0.0, 1.0);
vec4 up(0.0, 1.0, 0.0, 0.0);
mat4 mv = LookAt(eye, at, up);
glUniformMatrix4fv(model_view, 1, GL_TRUE, mv);
glDrawArrays(GL_TRIANGLES, 0, 3); // draw the points
glFlush();
可能出了什么问题?
【问题讨论】:
如何设置矩阵制服(model_view
,projection
)?能否请您显示那部分代码?
我在初始化函数的正上方声明了它们:GLuint model_view; GLuint projection; void initialize(void) ....
没有。你在哪里设置统一变量的值?
抱歉我的理解不足,我刚刚理解了你的问题。统一变量正在显示函数中设置(我已经编辑了我的帖子以显示该函数)。我已经进行了您提到的更改。最终还是以某种方式出现空白屏幕。再次道歉。
不要转置矩阵GL_TRUE
-> GL_FALSE
。查看答案。
【参考方案1】:
.w
组件的显式划分是多余的。
vec4 pos = projection * model_view * vPosition / vPosition.w;
vec4 pos = projection * model_view * vPosition;
注意,Perspective divide 是在剪辑后自动执行的。
由于向量从右边乘以制服,你不必转置矩阵:
glUniformMatrix4fv(projection, 1, GL_TRUE, p);
glUniformMatrix4fv(projection, 1, GL_FALSE, p);
glUniformMatrix4fv(model_view, 1, GL_TRUE, mv);
glUniformMatrix4fv(model_view, 1, GL_FALSE, mv);
见GLSL Programming/Vector and Matrix Operations
【讨论】:
您好,谢谢您的回复。我做了你提议的改变。但是,我还是一样。黑屏 =( @UditSingh 我又改了答案。以上是关于OpenGL相机移动程序顶点着色器问题的主要内容,如果未能解决你的问题,请参考以下文章