2

如果我在我的 c++ 代码中取两个 uint 向量的差异,转换为 int,转换为 float,然后传递给 GLSL,它会呈现良好。但是当我尝试让 GLSL 发挥作用并进行投射时,它会以几乎均匀的阴影覆盖屏幕,就好像我要绘制的正方形真的被放大了一样。是的,我真的很想在 GLSL 中这样做,如果只是看看如何。此外,我的矩阵和向量在 Eigen 对象中,尽管我不确定它是否重要。

在此处输入图像描述在此处输入图像描述

无论如何,为了确保清楚,我的 projviewMatrix (在两种情况下都相同)在给定应该是相同的浮点向量相乘时工作得非常好。所以我很确定问题出在 GLSL 中的 uint 向量减法上。我在 c++ 中执行了与在着色器中完全相同的操作(uint 向量减法、转换为 int 和转换为浮点数),但一个有效,一个无效。

这是我目前正在尝试的顶点着色器。我尝试将向量视为有符号整数并进行减法,因为运算应该相同......我认为。行为没有变化。

#version 150 core

uniform mat4 projviewMatrix;
uniform ivec3 camera;

in ivec3 in_Position;
in vec3 in_Color;

out vec3 pass_Color;

void main()
{
 gl_Position = projviewMatrix * vec4(in_Position - camera, 1.0);
 pass_Color = in_Color;
}

我试过传递in_Positioncamera作为 uvec3s,然后做ivec4(in_Position - camera, 1)和其他各种愚蠢的重新排列无济于事。还尝试重命名camerain_Camera. 我承认,那是绝望的。

我的制服路过的东西。当我传入工作浮点向量时,我只需注释掉 2 条相机线。

GLint viewLoc = glGetUniformLocation(shader.id(), "projviewMatrix"); //this is an ortho projection with 1/2 scaling, no rotation or translation
GLint cameraLoc = glGetUniformLocation(shader.id(), "camera");

glUniformMatrix4fv(viewLoc, 1, GL_FALSE, projview.data());
glUniform3uiv(cameraLoc, 1, camera.pos.data());

这就是我将 VBO 绑定到 VAO 的方式。

glBindBuffer(GL_ARRAY_BUFFER, vboID[0]);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLint), 0, GL_STREAM_DRAW);

glVertexAttribPointer(0, 3, GL_INT, false, 0, 0);

这是有效的浮点向量输入 GLSL。 in_Positionin_Position从上面减去camera并转换为 int 然后在我的 c++ 代码中浮动。

#version 150 core

uniform mat4 projviewMatrix;

in vec3 in_Position;
in vec3 in_Color;

out vec3 pass_Color;

void main()
{
 gl_Position = projviewMatrix * vec4(in_Position, 1.0);
 pass_Color = in_Color;
}

我的 projviewMatrix 只做两件事:正射投影和 1/2 缩放。没有平移或旋转,或其他任何东西。它的正交部分是使用这些参数生成的,宽度/高度是窗口的宽度/高度。

proj = orthoProj(-width, width, -height, height, -4, 4);

编辑:
应阿尔夫的要求:

这发生在我绑定我的制服后:

glBindBuffer(GL_ARRAY_BUFFER, vboID[0]);
int* buffer = (int*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

static const int width = 1000;
TestObject& test = game.test;

buffer[0] = test.pos[0] - width;
buffer[1] = test.pos[1] - width;
buffer[2] = 0;

buffer我不断地像这样手动 填写。test.pos是正方形的中心,当前等于camera.posxy 坐标 (1 << 31, 1 << 31)。在我在 c++ 中进行减法的情况下,缓冲区中的每个顶点之后都有 3 行这样的行:

buffer[0] -= camera.pos[0];
buffer[1] -= camera.pos[1];
buffer[2] -= camera.pos[2];

无论哪种方式,我都将数据作为整数传递。除了相机统一绑定和 GLSL 代码差异之外,上面的块(发生在每个buffer顶点上)是我的“GLSL 减法”和“C++ 减法”内容之间的唯一区别。

test.pos并且camera.pos都是Eigen::Vector3ui对象,所以 uint vector 3s。

编辑2:

我认为还值得注意的是,我有调试输出打印着色器中的任何错误,但没有。此外,如果我将in_Position和更改cameravec3,结果是与其他任何东西相同的蓝绿色阴影。

如果我在顶点着色器中创建自己的 ivec3 并使用它camera代替x 和 y 轴。我的顶点着色器中没有任何类型的杂耍或中间变量似乎能够解决这个问题。

编辑3:

使用glVertexAttribIPointer()将数据放入in_Position已解决部分问题,这肯定是 OpenGL 在我的 GLSL 代码执行之前进行了额外的强制转换以浮动。但是,camera向量仍然以同样的方式出现错误,我不知道除了我目前使用的glUniform3uiv. 我尝试使用glUniform3ui并输入它的 3 个值,但这也没有用。

4

1 回答 1

1

有2个问题。

  1. 应该设置指向整数属性的指针,glVertexAttribIPointer()因为这glVertexAttribPointer()会导致 openGL 对浮点数执行一些额外的转换。
  2. ivec3制服的设置glUniform3uiv()也可能导致意外的演员表。正确的解决方案是使用 unsinged uniform 并在着色器中执行投射。
于 2012-12-10T22:35:33.897 回答