opengl - 将转换发送到顶点着色器失败
问题描述
我正在使用 OpenGL 做我的第一步,目前无法将一些转换发送到我的顶点着色器。当我使用以下着色器程序时,一切正常,我可以看到我的对象(一个简单的三角形):
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos, 1.0);
}
在下一步中,我更改了着色器程序以接受来自外部的转换:
layout (location = 0) in vec3 aPos;
uniform mat4 inputTransform;
void main()
{
gl_Position = inputTransform * vec4(aPos, 1.0);
}
...以及我将转换数据发送到着色器的主循环:
unsigned int transformLoc = glGetUniformLocation(shaderProgram,"inputTransform");
glUseProgram(shaderProgram);
GLfloat trans[4] = {1.0, 0.0, 0.0, 1.0};
glUniformMatrix4fv(transformLoc, 1, GL_FALSE,trans);
现在我的三角形消失了,因为应用了一些非常无效的转换。“shaderProgram”中的值是正确的,它可以在之前调用片段着色器时正常工作。我也没有得到着色器程序的任何编译错误。
所以知道这里可能有什么问题吗?
解决方案
制服mat4 inputTransform
是 4*4 矩阵,而不是具有 4 个分量的向量。
请参阅数据类型 (GLSL) - 矩阵
您必须使用 16 个浮点数的数组对其进行初始化,例如通过Identity matrix:
GLfloat trans[16] = {
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
};
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, trans);
矩阵包含平移、方向(和比例)。在 GLSL 中 amat4
可以被初始化:
mat4 m44 = mat4(
vec4( Xx, Xy, Xz, 0.0),
vec4( Yx, Xy, Yz, 0.0),
vec4( Zx Zy Zz, 0.0),
vec4( Tx, Ty, Tz, 1.0) );
这意味着,如果要使用平移向量初始化矩阵,则可以手动初始化矩阵的平移分量:
Glfloat Tx = 1.0;
Glfloat Ty = 0.0;
Glfloat Tz = 0.0;
GLfloat trans[16] = {
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
Tx, Ty, Tz, 1.0
};
在 C++ 中,我建议将GLM 库用于矩阵和向量运算,这些运算与 OpenGL 和 GLSL 相关。
推荐阅读
- css - 如何使用引导程序美化 html?
- css - angularjs将括号添加到数组值输出
- python - PyQt5 鼠标悬停功能
- node.js - 如何访问写在 docker 容器卷上的文件并使用 NGINX 将 URL 共享给客户端
- javascript - 在用户选择旁边显示一个菜单
- android - recycler view Items之间如何通信
- python - 从规则冻结集中提取字符串
- java - Spock 使用 spring-boot-starter 1.5.16.RELEASE 测试问题
- python - 使用 Python 进行主成分分析
- python - 反向累积以获取 Pandas 中的逐月数据