OpenGL菜鸟问题

Posted

技术标签:

【中文标题】OpenGL菜鸟问题【英文标题】:OpenGL noob questions 【发布时间】:2014-05-14 23:46:26 【问题描述】:

这是使用名为 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"

我用谷歌搜索了这个,但无济于事。从字面上看,只有 4 个匹配搜索的东西,它们都不相关。我在这里玩错了吗?我的屏幕分辨率是

static public int height=720;
static public int width=height/9*16;

我应该使用归一化坐标 [-1,1] 还是只使用普通坐标 [-whatever,whatever] 以便我可以使用浮点数而不是双精度数。如果我在任何方向上制作一个 vec4 即 2,那么它就在屏幕外。但是我可以让我的坐标范围为 x 宽度的一半和 y 的高度的一半,但这样它们仍然会在屏幕上吗?假设 y 可以是 360,-360,y 可以是 640,-640 并且仍然在屏幕上?

【问题讨论】:

您确定您的显卡在着色器中支持双精度,并且 vec4 类型的元素是双精度类型的吗? 啊...我没有 GPU。谢谢你。将使用浮点数。 【参考方案1】:

你真的不应该首先使用双精度矩阵。

直到最近,GPU 才在可编程流水线中支持单精度或半精度浮点。事实上,多年来,对于单精度浮点数甚至有多少位存在一些分歧。 D3D9 在 pixel 着色器阶段只需要 24 位单精度,而 AMD/ATi 硬件几乎遵循了这一要求,直到他们推出了 D3D10 级 GPU(现在 desktop 供应商都同意单精度是 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 可悲地教出了一些坏习惯;并不是所有的浮点问题都可以通过加倍精度来解决。

【讨论】:

这些扩展都是 GLSL 4.30 的 core,我提出来了,如果您有兴趣,可以阅读更多关于它们的信息。可以看到,FP64 顶点属性其实是在双精度着色之后引入的。您还应该知道,虽然 FP64 着色是 DX11 中的可选功能,但 GL4 需要它。 谢谢。下一个问题会打扰您的核心,但我必须确定:您可以通过在浮点数后面添加 f 来获得小数?真假? Java适用吗? f 是一个精度 suffix。这意味着浮点常数是单精度的。没有它,基于 C 的语言(例如 C++、Java、C#、GLSL)将通常(GLSL 是规则的主要例外;P)假定常量是双精度的。在类型更安全的 C 派生语言中,让语言假定双精度尤其令人讨厌。 天哪!这是真的!现在我可以统治我生活的这个小小的隐喻世界了!哈哈哈。不,但那句话实际上毫无意义。感谢您的帮助。 查找glUniformMatrix4dv() 的文档是一种挑战。 GL4 手册页中没有提到它:opengl.org/sdk/docs/man/html/glUniform.xhtml。虽然手册页中缺少的东西并不罕见,但该规范的原型错误(const float *value 最后一个参数,最新 4.4 规范的第 124 页)。文字暗示它确实需要一个double *,并且头文件确认它。

以上是关于OpenGL菜鸟问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL-ES 益智游戏 - 使绘图电池高效?

怎么在visual studio 2010中配置openGL编程的环境啊?我在网上找了很多,都不和我的VS2010一样,基于C++编

OpenGL 4 采用

关于opengl无法运行的问题

如何使用 OpenGL 保存 OpenGL 绘制?

OpenGL vs OpenGL ES 2.0 - 可以轻松移植 OpenGL 应用程序吗?