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

Pointers Nim-lang-GLM和OpenGL矩阵指针统一问题,pointers,opengl,type-conversion,glm-math,nim-lang,Pointers,Opengl,Type Conversion,Glm Math,Nim Lang,当我使用NIM GLM创建投影矩阵并尝试将其传递给使用glUniformMatrix4fv的着色器时,我会遇到类型不匹配的问题。矩阵指针的类型是ptr float64,我假设glUniformMatrix4fv需要ptr float32 如果我能想出如何转换,或者确保投影矩阵以正确的精度开始,我会被诅咒的 有趣的是,我创建的所有其他材质(如模型和视图)都可以顺利地传递到着色器 这是代码 var projection = perspective(PI/2, aspectRatio, 0.1f,

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

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

透视图
将根据其第一个参数的类型返回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
请注意,后面的参数可以是int,它们将被转换

不要将float64转换为float32,您只是将其转换为零

echo proj32.caddr[] #0.75
echo proj64.caddr[] #0.7500000000000002
echo cast[ptr float32](proj64.caddr)[] #2.802596928649634e-45

投射指针确实有效。不应该将float64投射到float32!相反,从一开始就用正确的类型创建投影:
透视图(PI.float32/2,aspectRatio,0.1100)
这是一个很大的帮助。谢谢我是打字新手,所以还有很多东西要学。Nim是我接触Python之后的第一种语言。很高兴这对我有所帮助,而且由于您也是堆栈溢出新手,所以有一个