当前位置: 首页 > 知识库问答 >
问题:

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

田永春
2023-03-14

应该是这样的:

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

而不是这个:

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

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

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

我完全不知道该怎么做,我必须启用什么吗?

这是我在GLSL中的vertexShader代码

#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类:

'公共类Main{

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);
}

}`

共有1个答案

阎啸
2023-03-14

应该是这样的:

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

而不是这个:

格洛托(0,1000,600,0,-1,1)

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

 类似资料:
  • 在Hello Triangle教程中提到,着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。 前面的教程里我们简要地触及了一点着色器的皮毛,并了解了如何恰当地使用它们。现在我们会用一种更加广泛的形式详细解释

  • WebGL的着色器代码分为顶点着色器代码和片元着色器代码两部分,顶点着色器代码会在GPU的顶点着色器单元执行,片元着色器代码会在GPU的片元着色器单元执行,在WebGL渲染管线流程中,或者说GPU的渲染流程中,顶点着色器代码先执行处理顶点,得到一系列片元,然后再执行片元着色器代码处理片元。 main()函数 顶点着色器和片元着色器代码都有一个唯一的主函数main(),attribute、varyi

  • 标准着色器 Unity 标准着色器是一个内置着色器,具有非常全面的功能。它可以用于渲染『真实世界』的对象,例如,石头、木材、玻璃、塑料和金属,并支持各种各样的着色器类型和组合。通过使用或不使用材质编辑器中的各种纹理插槽和参数,可以很容易地启动或禁用其功能。 标准着色器还包括一个称为 物理着色器(Physically Based Shading,PBS) 的高级光照模型。物理着色器以模拟真实世界的方

  • 我似乎无法理解从顶点到像素的OpenGL管道过程。 有人能告诉我顶点法线在这两种着色技术中有多重要吗?据我所知,在gouraud中,在每个顶点计算照明,然后在顶点之间的多边形上插值结果颜色(在光栅化之前,这是在片段操作中完成的吗?),phong着色包括首先插值顶点法线,然后计算每个法线上的照明。 另一件事是,当凹凸贴图应用于一个平面(2个三角形)和一个砖纹理作为漫反射时,使用其相应的凹凸贴图,所有

  • 在一个教程之后,我将尝试使用FreeType在OpenGL中渲染文本。因此,灰度8位图像用作每个字符的纹理,使图像的每个字节对应于纹理的红色分量。 为了以其他颜色呈现文本,建议您使用着色器。但是,当使用提供的着色器时,我看到的不是彩色字母,而是彩色框,好像根本没有纹理。 以下是没有着色器时的效果: 这是它在着色器中的外观: (盒子的位置也会发生变化) 以下是顶点着色器代码: 这是片段着色器代码:

  • 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。 废话不多说,我们直接先看一个几何着色器的例子: #version 330 core layout