ModelViewProjection与WorldViewProjection相同吗?

时间:2011-08-10 18:42:17

标签: c++ opengl matrix hlsl cg

我正在将一些代码从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

2 个答案:

答案 0 :(得分:2)

在固定功能管道中,openGl和DirectX在定义空格方面有所不同。 OpenGl只有一个Model-和一个View-space,因此是一个ModelViewMatrix。 DX中还有一个世界空间。模型从模型空间转换为世界空间,然后转换为视图空间。

但是,在这种情况下,我认为可以将模型和视图空间视为相等。如果您的模型以世界为中心(使模型 - >世界翻译成为非操作),那就是这种情况。

使用着色器时,您基本上可以随心所欲地使用所需的空间。

DX也使用row-major和openGl列主要矩阵表示。因此,如果您复制DX示例,则必须转置矩阵并颠倒矩阵运算的顺序。

答案 1 :(得分:2)

  

通过将glMatrixMode设置为GL_MODELVIEW来渲染卷。我是否必须创建自己的矩阵?如果是这样,任何好的教程? :d

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

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

应解释为

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

等等。

此外,请参阅@Tobias Schlegel的答案。着色器以所谓的 Uniforms 的形式获得“常量”输入。较旧版本的OpenGL传递固定功能状态,如modelview矩阵。较新的OpenGL版本(OpenGL-3核心版及更高版本)摒弃了所有内置矩阵操作的东西。相反,期望用户跟踪转换piple并通过自定义的制服提供所有必需的矩阵。这也允许模拟DirectX行为。