着色器GLSL OpenGL上的投影矩阵问题
Trouble with Projection Matrix on a Shader GLSL OpenGL
解决方案
问题是在我的z区间中,我考虑了z上的负值,比如(-0.1f<z<100f),相反,我对近/远平面ex使用了正区间:(0.0f<z<100.0f),我在OpenGL中用不推荐的void排列了其他东西,并在glm::lookAt上排列了我的坏位置。
注意:不要将旧的渲染方式与新的渲染方式混合(这是一个很好的做法,但可能会有问题),顺便说一句:你必须了解你在空间中的位置。
谢谢大家:)
我是一名初级图形程序员,我试图使用基本的顶点/碎片着色器绘制一个非常简单的三角形。但是我的投影矩阵有一个错误,我找不到它。此外,我正在尝试创建一个整形void,我希望整形回调能很好地与着色器绘制的三角形配合使用。当我在我的渲染空白中写入这些产品时,会发生以下情况:
MVP=ProjectionMatrix*ModelViewMatrix;
结果->我不喜欢
如果我只给MVP分配ModelView矩阵,我得到了这个:
结果->我也不喜欢,因为原点应该在左上角,并且在窗口的中心
这些是我的重塑空隙
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 );
}
您似乎使用了固定函数管道(即GL1.x)调用和可编程着色器管道 上传着色器程序要使用的矩阵的正确方法是调用 类似地, 基本上,我建议您放弃所有不推荐使用的功能,重新实现 在你的渲染回调中,你只需要做glUniformMatrix4fv
(正如您所做的那样)。但是,OpenGL_Initialization(int w, int h)
函数中的glMatrixMode
、glLoadIdentity
和glLoadMatrix
调用实际上与正在使用的着色器程序的状态无关;相反,它们正在改变现在已弃用的矩阵堆栈的状态。glGetFloatv(GL_MODELVIEW_MATRIX,glm :: value_ptr(ModelViewMatrix))
调用获取内置矩阵堆栈使用的modelview矩阵数据,该数据可能包含垃圾数据。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 */
您的代码中有两个问题,
- 您的三角形位于z=0平面中,但您将近/远设置为0.1和100,因此您的三角形在视锥体之外,您需要将z值设置在(-0.1<z<-100)范围内
- 如果w,h是窗口的大小,那么光栅化后的三角形将只占据屏幕上的一个像素,换句话说,你几乎看不到屏幕上的任何东西。你可以考虑你在窗口空间中的像素单位,所以你需要有一个合理大小的三角形。因此,解决这个问题的方法是,要么将顶点位置更改得更大,例如(w/2,h/2,-1,w,h/2、-1,w、h,-1),要么将orth更改为glm::ortho(-1,1,-1,1、0.1f、100.0f)
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 协调转换和投影问题
- 着色器GLSL OpenGL上的投影矩阵问题
- 运动重投影问题的OpenCV结构
- 使用视锥体的3D到2D投影存在平移问题