OpenGL矩阵和着色器混淆
OpenGL Matrices and Shaders Confusion
本文关键字:OpenGL 更新时间:2023-10-16
我一直在使用GLM库学习现代OpenGL我正在介绍用于转换模型,定位相机和添加透视的矩阵的部分。
我有一个三角形:
const GLfloat vertexBufferData[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};
我有我的着色器:
GLuint programID = loadShaders("testVertexShader.glsl",
"testFragmentShader.glsl");
我有一个模型矩阵不做变换:
glm::mat4 modelMatrix = glm::mat4(1.0f); /* Identity matrix */
我有一个相机矩阵:
glm::mat4 cameraMatrix = glm::lookAt(
glm::vec3(4.0f, 4.0f, 3.0f), /*Camera position*/
glm::vec3(0.0f, 0.0f, 0.0f), /*Camera target*/
glm::vec3(0.0f, 1.0f, 0.0f) /*Up vector*/
);
我得到了一个投影矩阵
glm::mat4 projectionMatrix = glm::perspective(
90.0f, /*FOV in degrees*/
4.0f / 3.0f, /*Aspect ratio*/
0.1f, /*Near clipping distance*/
100.0f /*Far clipping distance*/
);
然后我把所有的矩阵相乘得到我想要画的三角形的最终矩阵:
glm::mat4 finalMatrix = projectionMatrix
* cameraMatrix
* modelMatrix;
然后我将矩阵发送到GLSL(我认为?):
GLuint matrixID = glGetUniformLocation(programID, "MVP");
glUniformMatrix4fv(matrixID, 1, GL_FALSE, &finalMatrix[0][0]);
然后我做着色器的东西,我不太理解:
/*vertex shader*/
#version 330 core
in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main(){
vec4 v = vec4(vertexPosition_modelspace, 1);
gl_Position = MVP * v;
}
/*fragment shader*/
#version 330 core
out vec3 color;
void main(){
color = vec3(1, 1, 0);
}
一切都编译并运行,但是我没有看到三角形。我移动了三角形和摄像机,想着也许摄像机指向了错误的方向,但没有成功。在引入矩阵之前,我可以成功地在屏幕上画出一个三角形,但是现在,没有三角形了。这个三角形应该在原点,相机距离原点几个单位,看着原点。
原来,你需要发送矩阵到着色器后你已经绑定了着色器。换句话说,在之后调用glUniformMatrix4fv()
glUseProgram()
很多事情都可能是您的问题-尝试输出vec4
颜色,将alpha显式设置为1。我经常做的一件事是让顶点着色器忽略所有输入,只直接输出顶点,例如:
void main(){
if (gl_VertexID == 0) {
gl_Position = vec4(-1, -1, 0, 1);
} else if (gl_VertexID == 1) {
gl_Position = vec4(1, -1, 0, 1);
} else if (gl_VertexID == 2) {
gl_Position = vec4(0, 1, 0, 1);
}
}
如果这有效,那么你可以尝试添加你的顶点位置输入。如果这是有效的,你可以添加你的相机或投影矩阵回来,等等。
更一般地说,删除一些东西,直到有些东西可以工作,并且你明白为什么它可以工作,然后添加部分,直到你不再理解为什么它不能工作。我经常错了一个符号,或者错了乘法的顺序。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量