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

问题描述

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

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