OpenGL相机移动程序顶点着色器问题

问题描述 投票:0回答:1

所以,我是一个初学图形程序员。我正在做一个摄像头移动的程序。我认为顶点着色器有问题。程序运行没有错误,但屏幕完全空白。这是我正在使用的顶点着色器。

#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类型。

我在显示函数中设置了统一的变量(position,model_view)。

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();
}

可能是什么地方出了问题?

c++ opengl shader vertex-shader
1个回答
1
投票

显式除法 .w 组件是多余的。

vec4 pos = projection * model_view * vPosition / vPosition.w;

vec4 pos = projection * model_view * vPosition;

请注意 透视鸿沟 是在剪接后自动执行的。

由于向量被乘以右方的统一形式,您不必对矩阵进行转置。

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编程矢量和矩阵操作

© www.soinside.com 2019 - 2024. All rights reserved.