Pointers Nim-lang-GLM和OpenGL矩阵指针统一问题
当我使用NIM GLM创建投影矩阵并尝试将其传递给使用glUniformMatrix4fv的着色器时,我会遇到类型不匹配的问题。矩阵指针的类型是ptr float64,我假设glUniformMatrix4fv需要ptr float32 如果我能想出如何转换,或者确保投影矩阵以正确的精度开始,我会被诅咒的 有趣的是,我创建的所有其他材质(如模型和视图)都可以顺利地传递到着色器 这是代码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,
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之后的第一种语言。很高兴这对我有所帮助,而且由于您也是堆栈溢出新手,所以有一个