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
。请查看答案。