【问题标题】:OpenGL camera movement program vertex shader issueOpenGL相机移动程序顶点着色器问题
【发布时间】: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。查看答案。

标签: c++ opengl glsl shader vertex-shader


【解决方案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 我又改了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多