问题描述
当我使用 NIM GLM 创建投影矩阵并尝试将其传递给带有 gluniformMatrix4fv 的着色器时,我遇到了类型不匹配问题。矩阵指针的类型为 ptr float64,我假设 gluniformMatrix4fv 需要 ptr float32。
如果我能弄清楚如何转换它或确保投影矩阵以正确的精度水平开始,我会被诅咒。
有趣的是,我创建的所有其他矩阵(例如模型和视图)都可以顺利传递给着色器。
这是代码...
var
projection = perspective(PI/2,aspectRatio,0.1f,100.0f)
projectionMatrixLocation: int32
#... later in the main loop
projectionMatrixLocation = glGetUniformlocation(shaderProgram,"projection")
#...
while not window.windowShouldClose:
#...
gluniformMatrix4fv(projectionMatrixLocation,1,false,projection.caddr) #here the error comes
#...
# in the shader
uniform mat4 projection;
解决方法
perspective
将根据其第一个参数的类型返回一个 Mat4[T]。你可以亲眼看看:
import glm,math
var
proj64 = perspective(PI / 2,1.33,0.1,100)
proj32 = perspective(PI.float32 / 2,100)
echo typeof proj32 #Mat4[float32]
echo typeof proj64 #Mat4[float],64 bit on every architecture
注意后面的参数可以是整数,它们会被转换。
不要将 float64 转换为 float32,您只是将其转换为零!
echo proj32.caddr[] #0.75
echo proj64.caddr[] #0.7500000000000002
echo cast[ptr float32](proj64.caddr)[] #2.802596928649634e-45
,
好的。我一直在用我的指针做一些黑魔法。我不确定这是不是解决方案,因为我目前看不到屏幕上呈现的任何内容。调试我在字符串中使用内联创建的 GSL 着色器很棘手,但至少现在正在编译。
正在更换...
glUniformMatrix4fv(projectionMatrixLocation,1,false,projection.caddr)
随着...
glUniformMatrix4fv(projectionMatrixLocation,cast[ptr float32] (projection.caddr))
如果这是一种危险的方法,请告诉我!