Java 试图用LWJGL运行一个简单的GLSL着色器程序,但此代码不是';行不通

Java 试图用LWJGL运行一个简单的GLSL着色器程序,但此代码不是';行不通,java,opengl,glsl,lwjgl,Java,Opengl,Glsl,Lwjgl,我尝试使用LWJGL运行这个简单的GLSL着色器代码,但显示仍然是黑色的。 (toFloatBuffer(float[]数组)方法在类和works中指定) 程序的输出如下 4.2.11733 Compatibility Profile Context Vertex shader was successfully compiled to run on hardware. Fragment shader was successfully compiled to run on hardware.

我尝试使用LWJGL运行这个简单的GLSL着色器代码,但显示仍然是黑色的。 (toFloatBuffer(float[]数组)方法在类和works中指定)

程序的输出如下

4.2.11733 Compatibility Profile Context

Vertex shader was successfully compiled to run on hardware.

Fragment shader was successfully compiled to run on hardware.

Vertex shader(s) linked, fragment shader(s) linked.
着色器似乎已正确编译和链接,并且受到我的OpenGL版本的支持。
知道我为什么会出现黑屏吗?

在顶点着色器中,输出总是
vec4(0,0,0,0)
这总是位于剪辑空间之外。因为在顶点着色器之后,GPU将使用第四个组件分割所有组件,如果第四个组件为0,则默认情况下该点位于剪辑空间之外


因为这是顶点着色器的唯一可能输出,所以该着色器永远不会在屏幕上绘制任何内容。如果将其替换为
vec4(0.0,0.0,0.0,1.0)
,则屏幕中央会出现一个红色圆点。

在顶点着色器中,输出总是
vec4(0,0,0,0)
这始终位于剪辑空间之外。因为在顶点着色器之后,GPU将使用第四个组件分割所有组件,如果第四个组件为0,则默认情况下该点位于剪辑空间之外


因为这是顶点着色器的唯一可能输出,所以该着色器永远不会在屏幕上绘制任何内容。如果将其替换为
vec4(0.0、0.0、0.0、1.0)
,则屏幕中央会出现一个红点。

片段着色器的目标是
#版本400
,并且您明确告诉它您希望将自己限制为
核心
(顺便说一句,这是默认配置文件)

gl\u FragColor
不是有效的gl内置核心GLSL。如果要将任何内容写入
gl\u FragColor
,则需要使用
#version 400 compatibility
编写着色器

这里有两个选项:
  • 重新编写着色器目标
    #版本400兼容性

    • 我怀疑这是您想要的,因为您已经声明了一个变量:
      out vec4 color


  • 输出到
    color
    而不是
    gl\u FragColor

  • 我想你想要选项2。尽管在任何情况下都不应在片段着色器中同时使用用户声明的
    out
    变量和写入
    gl\u FragColor
    ,但这是无效的


    -7个内置变量-p。87 已弃用:写入
    gl\u FragColor
    指定后续固定功能管道将使用的片段颜色。如果后续固定功能使用片段颜色,并且片段着色器可执行文件的执行未将值写入
    gl\u FragColor
    ,则使用的片段颜色未定义

    更高版本的规范更清楚地说明了这一点: -7个内置变量-p。106 使用兼容性配置文件时,片段着色器中提供以下片段输出变量:

     out vec4 gl_FragColor;
     out vec4 gl_FragData[gl_MaxDrawBuffers];
    

    您的片段着色器以
    #version 400
    为目标,并且您明确告诉它您希望将自己限制为
    核心
    (顺便说一句,这是默认配置文件)

    gl\u FragColor
    不是有效的gl内置核心GLSL。如果要将任何内容写入
    gl\u FragColor
    ,则需要使用
    #version 400 compatibility
    编写着色器

    这里有两个选项:
  • 重新编写着色器目标
    #版本400兼容性

    • 我怀疑这是您想要的,因为您已经声明了一个变量:
      out vec4 color


  • 输出到
    color
    而不是
    gl\u FragColor

  • 我想你想要选项2。尽管在任何情况下都不应在片段着色器中同时使用用户声明的
    out
    变量和写入
    gl\u FragColor
    ,但这是无效的


    -7个内置变量-p。87 已弃用:写入
    gl\u FragColor
    指定后续固定功能管道将使用的片段颜色。如果后续固定功能使用片段颜色,并且片段着色器可执行文件的执行未将值写入
    gl\u FragColor
    ,则使用的片段颜色未定义

    更高版本的规范更清楚地说明了这一点: -7个内置变量-p。106 使用兼容性配置文件时,片段着色器中提供以下片段输出变量:

     out vec4 gl_FragColor;
     out vec4 gl_FragData[gl_MaxDrawBuffers];
    

    你只会在屏幕中间看到一个红色点,看不到在你的VAO中放置了什么几何图形。您确定要绘制任何几何图形吗?当不使用着色器时,是否看到任何内容?另外:什么是
    out vec4 color
    ,为什么它既不写入也不绑定到任何输出缓冲区?很多问题。。。可以是任何东西,包括提到的红点@ratchet。@Thomas看看顶点着色器;没有属性输入,只是硬编码设置为0,0,0,0。。。这将导致在透视图分割过程中被0除。@ratchetfreak我看到了。然而,实际上必须调用顶点着色器,如果没有渲染几何体,情况就不会如此,对吗?关于附加输出向量4。。。我刚刚检查过,它实际上允许声明超级流输出,所以这确实没有问题。@Thomas,但是结果是w=0,GPU然后将0/0,0/0,0/0,1传递给片段着色器。这是什么政策?你只会在屏幕中间看到一个红色的点,看不到你的VAO里有什么实际的几何图形。您确定要绘制任何几何图形吗?当不使用着色器时,是否看到任何内容?还有:什么是
    out-vec4颜色
    ,为什么是i