着色器在 2d OpenGL 中不起作用

Posted

技术标签:

【中文标题】着色器在 2d OpenGL 中不起作用【英文标题】:Shaders don't work in 2d OpenGL 【发布时间】:2014-04-23 18:33:32 【问题描述】:

解决了设置正交视图时出现的错误:

应该是这样的:

glOrtho(-1, 1, 1, -1, -1, 1);

而不是这个:

glOrtho(0, 1000, 600, 0, -1, 1)

我的屏幕宽度是 1000,高度是 600。

感谢大家的帮助

我正在使用 OpenGL(lwjgl) 在 Java 中制作 2d 游戏。我可以画一个三角形,但是使用我的着色器时它不起作用。着色器编译时没有任何错误,但屏幕变黑了。

我完全不知道该怎么做,我必须启用某些东西吗?

这是我在 GLSL 中的顶点着色器代码

#version 430

layout (location = 0) in vec2 position;


void main()

    color = vec4(1, 0, 0, 1);

    gl_Position = vec4(position, -1, 1);

这是片段着色器:

#version 430 

void main()
 
    gl_FragColor = vec4(1, 1, 1, 1); 

我最近发现,如果我只运行片段着色器,它就可以工作,我会得到指定的颜色。但是如果我还运行顶点着色器,它就会变黑,所以问题出在顶点着色器上。

着色器类:

` 导入静态 org.lwjgl.opengl.GL20.; 导入静态 org.lwjgl.opengl.GL32.;

公共类着色器

private int program;

public Shader() 
    program = glCreateProgram();

    if (program == 0) 
        System.err.println("ShaderProgram creation failed!!!, couldn't find valid memory location!");
    


public void addVertexShader(String text) 
    addProgram(text, GL_VERTEX_SHADER);


public void addFragmentShader(String text) 
    addProgram(text, GL_FRAGMENT_SHADER);


public void addGeometryShader(String text) 
    addProgram(text, GL_GEOMETRY_SHADER);


public void addProgram(String shaderText, int type)
    int shader = glCreateShader(type);
    
    if (shader == 0)
        System.err.println("Shader creation failed!!!");
    
    
    glShaderSource(shader, shaderText);
    glCompileShader(shader);
    
    if(glGetShader(shader, GL_COMPILE_STATUS) == 0)
        System.err.println(glGetShaderInfoLog(shader, 2048));
    
    
    glAttachShader(program, shader);
    


public void compile()
    glLinkProgram(program);
    
    if (glGetProgram(program, GL_LINK_STATUS) == 0)
        System.err.println(glGetProgramInfoLog(program, 2048));
    
    
    glValidateProgram(program);
    
    if(glGetProgram(program, GL_VALIDATE_STATUS) == 0)
        System.err.println(glGetProgramInfoLog(program, 2048));
    


public void bind()
    glUseProgram(program);

`

主java类:

`公共类主

Mesh mesh;
Shader shader;

public Main() 
    init();
    mesh = new Mesh();
    Vertex[] data = new Vertex[]new Vertex(new Vector2f(500, 0)),
                                 new Vertex(new Vector2f(1000, 600)),
                                 new Vertex(new Vector2f(0, 600));
    
    mesh.addVertices(data);
    shader = new Shader();
    shader.addVertexShader(Util.loadShader("vertexShader.vs"));
    shader.addFragmentShader(Util.loadShader("fragmentShader.fs"));
    shader.compile();
    
    renderLoop();


private void MainLoop() 
    new Thread("Update")
        public void run()
            long lastTime = System.nanoTime();
            final double ns = 100000000 / 60;
            double delta = 0;
            while (!Display.isCloseRequested()) 
                long now = System.nanoTime();

                delta += (now - lastTime) / ns;

                lastTime = now;
                while (delta > 1) 
                    delta--;
                    update();
                
            
        
    .start();
   

private void renderLoop() 
    MainLoop();
    long Timer = System.currentTimeMillis();
    int fps = 0;
    while (!Display.isCloseRequested()) 
        glClear(GL_COLOR_BUFFER_BIT);
        render();
        Display.update();
        fps++;
        if(System.currentTimeMillis() - Timer > 1)
            System.out.println("FPS: " + fps);
            Display.setTitle("The Unknown Path || FPS: " + fps);
            fps = 0;
            Timer += 1000;
        
    



private void update() 
    


private void render() 
    shader.bind();
    mesh.render();



private void init() 
    try 
        Display.setDisplayMode(new DisplayMode(1000, 600));
        Display.create();
     catch (LWJGLException e) 
        e.printStackTrace();
    

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 1000, 600, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);

    // glEnable(GL_TEXTURE_2D);

    System.out.println(glGetString(GL_VERSION));


public static void main(String[] args) 
    Main m = new Main();

    System.exit(0);

`

【问题讨论】:

位置输入其实是3D的,需要自己套用modelview-projection矩阵(或许看看ftransform()函数) 你的片段着色器在哪里? @Joost:原发帖人说他要写一个2D游戏。将坐标作为 vec2 传递,并且不应用转换,在这种情况下听起来非常好。我可能会使用 0.0 而不是 -1.0 作为 z 坐标,但任何一个都应该工作。是的,需要片段着色器,以及设置顶点数据的 Java 代码部分。 感谢您的帮助。我有一个片段着色器,这里是#version 430 void main() gl_FragColor = vec4(1, 1, 1, 1); 您能否编辑您的帖子以包含 java 代码。看来剩下的唯一解释就是你的三角形越界了 【参考方案1】:

解决了设置正交视图时出现的错误:

应该是这样的:

glOrtho(-1, 1, 1, -1, -1, 1);

而不是这个:

glOrtho(0, 1000, 600, 0, -1, 1)

我的屏幕宽度是 1000,高度是 600。

感谢大家的帮助

【讨论】:

以上是关于着色器在 2d OpenGL 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

地图删除器在 C++ 中不起作用?

jQuery 的选择器在 iframe 中不起作用

Sass 加载器在 webpack 中不起作用

为啥我的 jQuery :not() 选择器在 CSS 中不起作用?

为啥我的 jQuery :not() 选择器在 CSS 中不起作用?

着色器在 Opengl Shader Builder 上工作,但不在我的 OpenGL 应用程序中