【问题标题】:GLSL Shader Draws Only Black Screen LWJGLGLSL 着色器仅绘制黑屏 LWJGL
【发布时间】:2015-08-30 11:54:54
【问题描述】:

我对着色器非常陌生,我得到了一些 GLSL 代码可以正确编译(没有任何编译器错误),并且由于某种原因,我一直出现黑屏。我正在使用 LWJGL。当我尝试渲染一个三角形时,我不断得到一个黑屏,即使根据我传递给片段着色器的颜色它应该是白色的。我已经发布了下面代码的sn-ps,希望足以找出问题所在。

片段着色器源代码

void main()
{
    gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
{

顶点着色器源代码

void main()
{
    gl_Position = ftransform();
}

着色器阅读器代码

        vertShaderString = shaderName + ".vert";
        fragShaderString = shaderName + ".frag";
        shader = GL20.glCreateProgram();
        vertShader = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);

        try{
            String temp;
            BufferedReader reader = new BufferedReader(new FileReader(new File(vertShaderString)));
            while ((temp = reader.readLine()) != null){
                vertSource.append(temp).append("\n");
            }
            reader.close();


            BufferedReader fragReader = new BufferedReader(new FileReader(new File(fragShaderString)));
            String otherTemp;
            while ((otherTemp = fragReader.readLine()) != null){
                fragSource.append(otherTemp).append("\n");
            }
            fragReader.close();
        }catch (Exception e){
            e.printStackTrace();
        }

着色器设置代码

        GL20.glShaderSource(vertShader, vertSource);
        GL20.glCompileShader(vertShader);

        if (GL20.glGetShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){
            System.err.println("Failed to compile vertex shader");
        }


        GL20.glShaderSource(fragShader, fragSource);
        GL20.glCompileShader(fragShader);

        if (GL20.glGetShaderi(fragShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){
            System.err.println("Failed to compile fragment shader");
        }

        GL20.glAttachShader(shader, vertShader);
        GL20.glAttachShader(shader, fragShader);
        GL20.glLinkProgram(shader);
        GL20.glValidateProgram(shader);

启用和禁用着色器代码

public void begin(){
    GL20.glUseProgram(shader);
}

public void end(){
    GL20.glUseProgram(0);
}

渲染方法

public void render(){
        GL11.glClearColor(0, 0, 0, 1);
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        GL11.glColor4f(1, 0, 0, 1);
        shader.begin();
        GL11.glBegin(GL11.GL_TRIANGLES);
        GL11.glVertex2i(0,  0);
        GL11.glVertex2i(500, 0);
        GL11.glVertex2i(250, 250);
        GL11.glEnd();
        shader.end();

    }

【问题讨论】:

  • 您应该检查GL_LINK_STATUS 以及GL_COMPILE_STATUSglGetError 也很有用。它是否在没有激活着色器的情况下绘制?如果不是,它可能指向投影/视图之外的绘图。
  • @jozxyqk 它在没有着色器的情况下编译得很好,但是当我使用着色器时,根本没有绘制任何东西。我像你说的那样添加了标志和 glGetError() 函数,但是我在任何地方都没有收到任何错误。
  • 片段着色器中的拼写错误{ 的缩写,大概是fragShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER); 行,只是没有显示我无法发现任何明显的东西。引入语法错误会停止着色器编译吗?您最近是否更新了驱动程序?
  • 忘记初始化片段着色器变量是导致问题的原因!非常感谢!
  • 您可能希望将此添加为答案并接受它。

标签: glsl shader lwjgl fragment-shader vertex-shader


【解决方案1】:

问题已经解决,感谢jozxyqk。我忘记初始化片段着色器变量了。

fragShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);

通过添加这行代码,问题就解决了。

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多