2

我正在将一些代码从 HSLSL 和 XNA 转换为 CG 和 OpenGL。

该代码用于渲染体积数据。但是体积数据也不是在每个维度上使用相同的距离进行采样的,例如 (0.9f, 1f, 1f)。因此需要应用比例因子。

在 XNA 和 HLSL 示例中,它们执行以下操作:

mul(input.Position * ScaleFactor, WorldViewProj);

WorldViewProj 被传递到着色器的位置。

在 OpenGL 中,我的印象是 glstate.matrix.mvp 是 ModelViewProjection,其中 ModelView 是 World * View。显然我错了,因为当我执行以下操作时,没有绘制任何内容。

output.Position = mul( input.Position * scale, glstate.matrix.mvp);

体积是在 glMatrixMode 设置为 GL_MODELVIEW 的情况下渲染的。我必须创建自己的矩阵吗?如果是这样,有什么好的教程吗?:D

4

2 回答 2

2

在固定功能管道中,openGl 和 DirectX 在定义空间的方式上有所不同。OpenGL 只有一个模型空间和一个视图空间,因此是一个模型视图矩阵。在 DX 中还有一个世界空间。模型从模型空间转换为世界空间,然后再转换为视图空间。

但是,在这种情况下,我认为您可以将模型和视图空间视为平等。如果您的模型以 World 为中心(使 Model->World 转换成为非操作),就会出现这种情况。

使用着色器时,您基本上可以自由地做任何您想做的事情并使用您想要的空间。

DX 也使用行优先和 openGl 列优先矩阵表示。因此,如果您复制 DX 示例,则必须转置矩阵并反转矩阵运算的顺序。

于 2011-08-10T18:59:57.733 回答
2

体积是在 glMatrixMode 设置为 GL_MODELVIEW 的情况下渲染的。我必须创建自己的矩阵吗?如果是这样,有什么好的教程吗?:D

glMatrixMode有点像with其他矩阵操作函数的语句。所以

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate(...);

被解释为

modelview_matrix.load_identity();
modelview_matrix.translate(...);

等等。

此外,请参阅@Tobias Schlegel 的答案。着色器以所谓的Uniforms形式获得“恒定”输入。旧版本的 OpenGL 传递固定的函数状态,如模型视图矩阵。较新的 OpenGL 版本(OpenGL-3 核心和更高版本)弃用了所有内置矩阵操作的东西。取而代之的是,用户应该跟踪转换堆并通过自定义制服提供所有需要的矩阵。这也允许模拟 DirectX 行为。

于 2011-08-10T19:05:37.983 回答