Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 着色器不';不能在二维OpenGL中工作 解决了设置正交视图时出现的错误:_Java_Opengl_Glsl_Shader_Lwjgl - Fatal编程技术网

Java 着色器不';不能在二维OpenGL中工作 解决了设置正交视图时出现的错误:

Java 着色器不';不能在二维OpenGL中工作 解决了设置正交视图时出现的错误:,java,opengl,glsl,shader,lwjgl,Java,Opengl,Glsl,Shader,Lwjgl,应该是这样的: 格洛托(-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

应该是这样的:

格洛托(-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类:

`公共班机{

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,1,1,-1,-1,1)

与此相反:

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

我的尖叫声宽度是1000,高度是600


感谢所有的帮助位置输入实际上是3D的,你需要自己应用modelview投影矩阵(也许看看
ftTransform()
函数)你的碎片着色器在哪里?@Joost:原始海报上说他想写一个2D游戏。将坐标作为vec2传递,而不应用变换,对于这种情况来说,听起来非常好。对于z坐标,我可能会使用0.0而不是-1.0,但这两种方法都可以。是的,需要片段着色器,以及设置顶点数据的Java代码部分。谢谢您的帮助。我有一个片段着色器,这里是#version 430 void main(){gl_FragColor=vec4(1,1,1,1);}的代码。您可以编辑您的帖子以包含java代码吗。看来唯一剩下的解释就是你的三角形出界了