Groovy 为什么不是';“我的OpenGL”;“你好,世界”;翻译

Groovy 为什么不是';“我的OpenGL”;“你好,世界”;翻译,groovy,lwjgl,vbo,opengl-3,vao,Groovy,Lwjgl,Vbo,Opengl 3,Vao,两天来我一直在为这件事头疼。我正在尝试提取最简单的OpenGL核心~2.0-3.2绘图序列,这样我就可以从中构建代码并真正理解API。我遇到的问题是,这些教程似乎从来没有为它们使用的OpenGL版本提供有用的标签,而我碰巧在文档中看到了如何从我的上下文请求特定的版本 我确信我现在已经启用了3.2内核,因为即时模式绘图会出错(这是一件好事!我想把即时模式抛在脑后!),我还尝试去掉任何可能会破坏我的显示的花哨的东西,比如坐标变换或三角形缠绕。问题是,我无法在屏幕上显示任何内容 在这个程序之前的迭代中

两天来我一直在为这件事头疼。我正在尝试提取最简单的OpenGL核心~2.0-3.2绘图序列,这样我就可以从中构建代码并真正理解API。我遇到的问题是,这些教程似乎从来没有为它们使用的OpenGL版本提供有用的标签,而我碰巧在文档中看到了如何从我的上下文请求特定的版本

我确信我现在已经启用了3.2内核,因为即时模式绘图会出错(这是一件好事!我想把即时模式抛在脑后!),我还尝试去掉任何可能会破坏我的显示的花哨的东西,比如坐标变换或三角形缠绕。问题是,我无法在屏幕上显示任何内容

在这个程序之前的迭代中,我确实有时会在屏幕上使用随机坐标获得一个白色三角形,但在我看来,顶点设置不正确,奇怪的位组合会产生奇怪的结果。符号在三角形出现的位置并不重要-因此,我的理论是,要么顶点信息没有正确地传输到顶点着色器,要么着色器正在破坏它。问题是,我正在检查我能找到的所有结果和日志,着色器编译和链接非常漂亮

我将在下面提供链接和代码,但除了在屏幕上显示三角形之外,我想知道,我是否可以让着色器程序将文本和/或诊断值吐出到其着色器文件夹中?这将大大简化调试过程

我正在咨询的各种教程是

(不在 提供了代码,但我尝试的是带有布局的420版 限定符0(在\u位置)和1(在\u颜色中))

代码(LWJGL+Groovy)

这确实会在屏幕上产生一些光栅化的东西,但这完全不是我所期望的。它不是简单地重新定位右下角(右上角?)点,而是在完全白色的空白和以下两种形状之间翻转:

如果替换第二个或第三个顶点,则会发生这种情况。如果替换第一个顶点,屏幕上不会显示任何内容。因此,为了检查我关于哪个顶点实际出现在窗口中心的假设,我尝试了以下方法:

static final String vertexShader = """
    #version 150
    in vec2 in_Position;
    in vec3 in_Color;

    smooth out vec3 ex_Color;
    void main(void) {
        gl_Position = vec4(in_Position,0.0,1.0);
        ex_Color = vec3(1.0, 1.0, 1.0);
        if (gl_VertexID==0) ex_Color = vec3(1.0, 0.0, 0.0);
        if (gl_VertexID==1) ex_Color = vec3(0.0, 1.0, 0.0);
        if (gl_VertexID==2) ex_Color = vec3(0.0, 0.0, 1.0);
        //ex_Color = in_Color;
    }

""";

static final String fragmentShader = """
    #version 150

    smooth in vec3 ex_Color;
    out vec4 fragColor;

    void main(void) {
        fragColor = vec4(ex_Color, 1.0);
        //fragColor = vec4(1.0, 1.0, 1.0, 1.0);
    }
""";
很简单,对吧?中间的顶点应该可能是第一个“红色”顶点,因为它是非可选顶点,没有它,我就不能在屏幕上画任何东西。事实并非如此。半屏幕块始终如预期的那样为红色,但左向三角形形状始终是我替换的任何顶点的颜色-替换第二个顶点使其变为绿色,替换第三个顶点使其变为蓝色。看起来“-0.8,-0.8”和“0.8,-0.8”都离屏幕很远,可见的三角形部分实际上是一条无限细的线。但我不认为这是由于变换造成的——这更像是一个对齐问题,其任意阈值在0.9左右,将坐标发射到远处。与此类似,顶点缓冲区中的值的有效位可能会以in_位置值的指数递增

为了继续往下钻,我增加了硬编码GLSL的数量,以完全忽略缓冲区-

static final String vertexShader = """
    #version 150
    in vec2 in_Position;
    in vec3 in_Color;

    smooth out vec3 ex_Color;
    void main(void) {
        gl_Position = vec4(in_Position,0.0,1.0);
        ex_Color = vec3(1.0, 1.0, 1.0);
        if (gl_VertexID==0) {
            ex_Color = vec3(1.0, 0.0, 0.0);
            gl_Position = vec4(0.0, 0.8, 0.0, 1.0);
        }
        if (gl_VertexID==1) {
            ex_Color = vec3(0.0, 1.0, 0.0);
            gl_Position = vec4(-0.8, -0.8, 0.0, 1.0);
        }
        if (gl_VertexID==2) {
            ex_Color = vec3(0.0, 0.0, 1.0);
            gl_Position = vec4(0.8, -0.8, 0.0, 1.0);
        }
        //ex_Color = in_Color;
    }

""";
这将产生所需的结果,一个漂亮的大三角形,每个顶点上有不同的颜色。很明显,我想从顶点缓冲区中得到相同的三角形,但这是一个非常好的开始——有两个顶点,我至少可以知道最终顶点的射出方向。在第一个顶点的情况下,它肯定是向下的


我还弄明白了如何在配置文件中启用调试模式,它向我吐出了颜色缓冲区错误。好!!这是一个开始。现在为什么它没有抛出大量的VBO错误呢?

您的代码与核心配置文件不兼容。您的
reportErrors()
应该实际触发。在核心配置文件中,必须使用顶点阵列对象(VAO)进行顶点设置。在设置顶点状态之前,您必须使用
glgenvertexarray()
生成VAO,并使用`glBindVertexArray()将其绑定

在片段着色器中使用
gl\u FragColor
也是不推荐的。您需要在核心配置文件中声明自己的
out
变量,例如:

out vec4 FragColor;
...
    FragColor = ...

答案终于在一瞬间从他的灵感中得到了

这是相当错误的,所以让我解释一下什么是最终正确的。我的开发环境是英特尔芯片上的java。所有java都以big-endian运行。我很困惑,我的浮动指数似乎是结束的意义,但看到这篇文章,它终于击中了我-最简单的方式发生,如果endianness是翻转!浮动缓冲区仍将是big endian。OpenGL以本机字节顺序以外的任何方式运行的可能性几乎为零。我咨询的lwjgl资源中要么没有提到这个怪癖,要么我错过了它们

此程序中字节缓冲区的正确初始值设定项为:

protected static FloatBuffer vboBuffer = ByteBuffer.allocateDirect(6*4).order( ByteOrder.nativeOrder(  ) ).asFloatBuffer();
protected static FloatBuffer colorBuffer = ByteBuffer.allocateDirect(9*4).order( ByteOrder.nativeOrder(  ) ).asFloatBuffer();

重要的部分是
字节顺序.nativeOrder()

插入:int-vaoHandle=GL30.glgenvertexarray();GL30.glBindVertexArray(沃汉德尔);禁用背面消隐后,但在定义VBO和颜色缓冲区之前,不会更改输出。我是否需要指定VertexAttribute指针之外的内容?因为我已经从片段着色器中获得了输出,所以我确信,尽管不推荐使用,它仍然可以工作;不过,很高兴知道,我将函数切换为“out vec4 fragColor;”,输出没有变化。我会在一点时间内更新上面的源代码。我用Java做过一些OpenGL编程,从来不用担心缓冲区的字节顺序。不过,这已经在Android上实现了。这些设备也是小endian,但可能是h
out vec4 FragColor;
...
    FragColor = ...
protected static FloatBuffer vboBuffer = ByteBuffer.allocateDirect(6*4).order( ByteOrder.nativeOrder(  ) ).asFloatBuffer();
protected static FloatBuffer colorBuffer = ByteBuffer.allocateDirect(9*4).order( ByteOrder.nativeOrder(  ) ).asFloatBuffer();