这是使用名为lwjgl的OpenGL端口。所以我要说我有一个双数组:
double[] orthographic={1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,
0.0,0.0,-2.0,5.0,
0.0,0.0,0.0,1.0,};
我有一个顶点着色器:
String vertexshader = "#version 430 core"
+ System.getProperty("line.separator")
+ "layout(location = 0) in vec4 vertexin;"
//Does this have to be a dvec4?
+ "layout(location = 1)uniform mat4 orthographic;"
//Does this have to be a dmat4?
+ "void main(){"
+ "gl_Position = orthographic * vertexin;"
//Is this multiplication correct? Do I need to reverse it?
+ "}";
还可以说我有一个理论上完全正常运行的片段着色器。所以我想将正交数组发送到mat4中。鉴于它是一个双数组,我该怎么做?我可以使用gluniformmatrix4()吗?我需要将mat4制作成dmat4吗?如果这样那意味着我必须因为施法而将vec4变成dvec4。好吧,如果我这样做,那么OpenGL会抛出错误
Failure in compiling vertex shader. Error log:
0(2) : error C7011: implicit cast from "f64vec4" to "vec4"
我用Google搜索了但无济于事。实际上只有4件与搜索相匹配的东西都没有相关。我在这里玩错了吗?我的屏幕分辨率是
static public int height=720;
static public int width=height/9*16;
我应该使用标准化坐标[-1,1]还是普通坐标[-whatever,whatever],以便我可以使用浮点数而不是双精度数。如果我在任何方向上制作一个说2的vec4,那么它就不在屏幕上了。但是我可以让我的坐标范围是x的宽度的一半和y的一半高度,但是它们仍然会在屏幕上吗?假设y可能是360,-360,y可能是640,-640,仍然在屏幕上?
答案 0 :(得分:3)
直到最近,GPU才支持可编程流水线中的单精度或半精度浮点。实际上,多年来对于单精度浮点数甚至有多少位存在一些分歧。 D3D9在像素着色器阶段仅需要24位单精度,AMD / ATi硬件几乎遵循这一要求,直到他们推出D3D10级GPU(现在桌面供应商所有同意单精度是32位)。
float[] orthographic = {1.0f,0.0f, 0.0f,0.0f,
0.0f,1.0f, 0.0f,0.0f,
0.0f,0.0f,-2.0f,5.0f,
0.0f,0.0f, 0.0f,1.0f };
dmat4
。此扩展名(GL_ARB_gpu_shader_fp64
)引入了设置双精度4x4矩阵统一的必要函数:
glUniformMatrix4dv (...)
顺便提一下,使用双精度顶点属性需要不同的扩展名(GL_ARB_vertex_attrib_64bit
。
现在,既然您使用的是Java,那么您的实际函数名称和传递的参数会有所不同,但关键是您需要支持FP64的GPU来实现这一点。而且这对现实世界的好处很少,Java遗憾地教导了一些坏习惯;并非所有的浮点问题都可以通过加倍精度来解决。