Nim lang GLM 和 OpenGL 矩阵指针统一问题

Nim lang GLM and OpenGL matrix pointer uniform issues

当我使用 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;

好的。我一直在用我的指针做一些黑魔法。我不确定这是解决方案,因为我目前看不到屏幕上呈现的任何内容。使用内联字符串创建的 GSL 着色器进行调试很棘手,但至少现在正在编译。

正在替换...

glUniformMatrix4fv(projectionMatrixLocation, 1, false, projection.caddr)

与...

glUniformMatrix4fv(projectionMatrixLocation, 1, false, cast[ptr float32] (projection.caddr))

如果这是一种危险的方法,请告诉我!

perspective 将 return 一个 Mat4[T],基于其第一个参数的类型。你可以自己看看:

import glm,math
var 
  proj64 = perspective(PI / 2, 1.33, 0.1, 100)
  proj32 = perspective(PI.float32 / 2, 1.33, 0.1, 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