C++ OpenGL摄影机移动程序顶点着色器问题

C++ OpenGL摄影机移动程序顶点着色器问题,c++,opengl,glsl,shader,vertex-shader,C++,Opengl,Glsl,Shader,Vertex Shader,所以,我是一个初学者学习图形程序员。我正在做一个摄像机移动的程序。我认为顶点着色器有问题。程序运行时没有错误,但屏幕完全空白。下面是我正在使用的顶点着色器: #version 330 in vec4 vPosition; out vec4 vColor; uniform mat4 model_view; uniform mat4 projection; void main() { vec4 pos = projection * model_view * vPosition / v

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

#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)
};
模型视图和投影在主要应用和全局应用中为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();
}

可能出了什么问题?

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

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

vec4 pos=投影*模型视图*位置;
注意,剪切后将自动执行

由于向量与右边的矩阵相乘,因此不必转置矩阵:

glUniformMatrix4fv(投影,1,GL_-TRUE,p)

glUniformMatrix4fv(投影,1,GL_假,p);
glUniformMatrix4fv(模型视图,1,总图真实,mv)

glUniformMatrix4fv(模型视图,1,GL错误,mv);

参见

嘿,谢谢你的回复。我做了你提议的改变。然而,我还是得到了同样的结果。Blank Screen=(@udith我再次更改了答案。如何设置矩阵制服(
model\u view
projection
)?能否显示代码的那部分?我在初始化函数的正上方声明了它们:
GLuint model\u view;GLuint projection;void initialize(void){..
否。您在哪里设置统一变量的值?很抱歉我不理解您的问题,我刚刚理解了您的问题。统一变量是在display func中设置的(我编辑了我的帖子以显示该函数)。我已经做了您提到的更改。不知怎么的,最终还是出现了一个空白屏幕。再次道歉。不要将矩阵转换为
GL\u TRUE
->
GL\u FALSE
。请查看答案。