解决方案
问题出在我的 z 区间上,我正在考虑 z 上的负值,例如 (-0.1f < z < 100f),而是我对近/远平面使用正区间 ex : (0.0f < z < 100.0f) ,我在 OpenGL 中用已弃用的 void 安排了其他内容,并在 glm::LookAt 上安排了我的错误位置。
注意:不要将旧的渲染方式与新的渲染方式混合(这是一个很好的做法,但可能会出现问题),顺便说一句:您必须了解您在空间中的位置。
谢谢大家:)
我是一名初学者图形程序员,我尝试使用基本的顶点/片段着色器绘制一个非常简单的三角形。但我的投影矩阵有一个错误,我找不到它。另外,我正在尝试执行 reshape 无效,并且我希望 reshape 回调能够与着色器绘制的三角形配合良好。当我在渲染无效中写入这些产品时,会发生以下情况:
MVP = ProjectionMatrix * ModelViewMatrix;
结果 -> I dont Like
如果我只将 ModelView 矩阵分配给 MVP,我会得到:
这些是我的 reshape 空隙
void OpenGL_Initialization(int w, int h){
ProjectionMatrix = glm :: ortho(0.0f,(GLfloat)w,(GLfloat)h,0.0f,0.1f, 100.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glLoadMatrixf(glm :: value_ptr(ProjectionMatrix));
glMatrixMode(GL_MODELVIEW);
}
void Reshape(int w, int h){
width = w;
height = h;
glViewport(0,0,w,h);
OpenGL_Initialization(w,h);
}
这是我的渲染回调:
void Render(){
glClearColor(0.75,0.75,0.75,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glGetFloatv(GL_MODELVIEW_MATRIX,glm :: value_ptr(ModelViewMatrix));
MVP = ProjectionMatrix * ModelViewMatrix;
glUniformMatrix4fv(glGetUniformLocation(ProgramHandler,"MVP"),1,GL_FALSE,glm :: value_ptr(MVP));
glBindVertexArray(vaoHandle);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glutSwapBuffers();
}
这些也是我的顶点和片段着色器
#version 400
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexColor;
uniform mat4 MVP;
out vec3 Color;
void main(){
Color = VertexColor;
gl_Position = MVP*vec4(VertexPosition,1.0);
}
#version 400
in vec3 Color;
out vec4 FragColor;
void main(){
FragColor = vec4(Color,1.0);
}
VBO 和 VAO 初始化:
void InitVBO(GLuint programHandler){
glBindAttribLocation(programHandler,0,"VertexPosition");
glBindAttribLocation(programHandler,1,"VertexColor");
GLfloat positionData[] = {-0.5f,0.5f,0.0f,0.0f,-.5f,0.0f,0,0,0};
GLfloat colorData[] = {1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f};
GLuint vboHandles[2];
glGenBuffers(2,vboHandles);
glBindBuffer(GL_ARRAY_BUFFER,vboHandles[0]);
glBufferData(GL_ARRAY_BUFFER,9*sizeof(GLfloat),positionData,GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,vboHandles[1]);
glBufferData(GL_ARRAY_BUFFER,9*sizeof(GLfloat),colorData,GL_STATIC_DRAW);
glGenVertexArrays(1, &vaoHandle);
glBindVertexArray(vaoHandle);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, vboHandles[0]);
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0,(GLubyte *)NULL );
glBindBuffer(GL_ARRAY_BUFFER, vboHandles[1]);
glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0,(GLubyte *)NULL );
}
最佳答案
看来您正在使用 fixed-function pipeline 的组合(即 GL1.x)调用和可编程着色器管道调用。虽然它可能不会导致您所描述的问题,但通常认为使用其中之一而不是同时使用两者是良好的做法。
上传着色器程序使用的矩阵的正确方法是调用glUniformMatrix4fv
(正如您所做的那样)。但是,OpenGL_Initialization(int w, int h)
函数中的 glMatrixMode
、glLoadIdentity
和 glLoadMatrix
调用实际上会与您正在使用的着色器程序的状态无关;相反,他们正在改变 now-deprecated 的状态矩阵堆栈。
类似地,glGetFloatv(GL_MODELVIEW_MATRIX,glm::value_ptr(ModelViewMatrix))
调用正在获取内置矩阵堆栈使用的模型 View 矩阵数据,其中可能包含垃圾数据。
基本上,我建议您放弃所有已弃用的功能并重新实现 OpenGL_Initialization
函数,如下所示:
void OpenGL_Initialization(int w, int h){
ProjectionMatrix = glm::ortho(0.0, (GLfloat)w, (GLfloat)h, 0.0, -1.0, 1.0);
}
在渲染回调中你只需这样做
glClearColor(0.75, 0.75, 0.75, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glm::mat4 ModelViewMatrix; // default constructor => identity
MVP = ProjectionMatrix * ModelViewMatrix;
glUseProgram(ProgramHandler); // possibly redundant
GLuint MVP_loc = glGetUniformLocation(ProgramHandler, "MVP");
glUniformMatrix4fv(MVP_loc, 1, GL_FALSE, glm::value_ptr(MVP));
/* draw, swap buffers */
关于c++ - OpenGL 着色器 GLSL 上的投影矩阵出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18363227/