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_viewprojection)?能否请您显示那部分代码? 我在初始化函数的正上方声明了它们: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相机移动程序顶点着色器问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL顶点着色器:奇怪的矩阵转换

opengl着色器程序中的重复顶点

着色器中的 OpenGL 法线变换

此顶点着色器中的统一浮动不起作用

OpenGL着色器没有将变量从顶点传递到片段着色器

OpenGL - 动画是由着色器完成的吗?