【发布时间】:2026-01-03 03:50:01
【问题描述】:
我正在尝试以不同的方式在我的 3D 世界中移动对象,但我无法在不影响整个场景的情况下移动一个对象。我尝试使用具有不同统一名称的第二个着色器,但得到了一些非常奇怪的结果,例如对象消失和其他烦人的东西。
我尝试链接和取消链接程序,但是当我将不同的矩阵应用于不同的着色器以希望看到它们以不同的方式移动时,所有内容似乎都可以一起转换。
TRANSLATE 矩阵只是一个旋转 * 缩放 * 平移矩阵。
编辑 - 这是我的制服的设置方法:
//All of my mat4's
// Sorry for not initialising any of the vec3 or mat4's don't want the code to be too lengthy
perspectiveproj = glm::perspective(glm::radians(95.0f), static_cast<float>(width)/height , 0.01f, 150.0f);
views = glm::lookAt(position, position + viewdirection, UP);
trans1 = glm::rotate(trans1, 0.0f, glm::vec3(0.0f, 1.0f, 0.0f));
trans1 = glm::scale(trans1, glm::vec3(0.0f, 0.0f, 0.0f));
trans1 = glm::translate(trans1, glm::vec3(1.0f, 0.0f, 1.0f));
//These are the uniforms for my perspective matrix per shader
int persp = glGetUniformLocation(shader_one, "perspective");
glUniformMatrix4fv(persp, 1, GL_FALSE, glm::value_ptr(perspectiveproj));
int persp2 = glGetUniformLocation(shader_two, "perspective");
glUniformMatrix4fv(persp2, 1, GL_FALSE, glm::value_ptr(perspectiveproj));
//These are the uniforms for my lookAt matrix per shader
int Look = glGetUniformLocation(shader_one, "lookAt");
glUniformMatrix4fv(Look, 1, GL_FALSE, glm::value_ptr(views));
int Look2 = glGetUniformLocation(shader_two, "perspective");
glUniformMatrix4fv(Look2, 1, GL_FALSE, glm::value_ptr(views));
//This is the one uniform for my Translation to one shader object matrix
moving Shader two
//objects differently than shader one
int Moveoneshader = glGetUniformLocation(shader_two, "TRANSLATE");
glUniformMatrix4fv(Moveoneshader, 1, GL_FALSE, glm::value_ptr(trans1))
着色器一:
gl_Positions = perspective * lookAt * vec4(position.x, position.y, position.z, 1.0);
着色器二:
gl_Positions = perspective * lookAt * TRANSLATE * vec4(position.x, position.y, position.z, 1.0);
链接和绘图:
glUseProgram(shader_one);
glBindVertexArray(vao_one);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
glDeleteProgram(shader_one);
glUseProgram(shader_two);
glBindVertexArray(vao_two);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
glDeleteProgram(shader_two);
【问题讨论】:
-
通常,您只需为每个对象使用一个模型矩阵。另外:为什么在使用后删除着色器程序?
-
@derhass我就是这么想的。现在我知道不会了,谢谢。
-
@derhass 我整晚都在尝试这个,但我继续黑屏??!!有什么想法吗?
-
问题不是由着色器程序引起的。该问题是由制服的初始化引起的。您必须显示设置统一变量
TRANSLATE的代码。 -
"我已经尝试了一整晚" 好吧:什么你试过了吗?如果你不展示你的所作所为,就不可能发现任何错误。