OpenGL noob问题

时间:2014-05-14 23:46:26

标签: java opengl lwjgl

这是使用名为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,仍然在屏幕上?

1 个答案:

答案 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遗憾地教导了一些坏习惯;并非所有的浮点问题都可以通过加倍精度来解决。