@Redens

OpenGL Как починить шейдеры GLSL?

Эта проблема началась еще с C++. тогда я делал движок на нем. Именно после того, как я добавил шейдеры в него, движок переставал работать. После того, как я перепробовал все варианты, я решил попробовать сделать тоже самое на java. Разумеется код уже был другой. Я использовал библиотеку lwjgl. Но именно после загрузки шейдеров, все переставало работать. Сначала я думал, что может что-то с версией glsl не то, но вроде все равно все не работает. Вот

код загрузки шейдеров
package com.redens.Renderer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.lwjgl.opengl.GL46C.*;

public class Shader {
    public int programId;

    public Shader(String vsSrc, String fsSrc)
    {
        Map<Integer, String> shaderSources = new HashMap<Integer, String>(2);
        shaderSources.put(1, this.readFile(vsSrc));
        shaderSources.put(2, this.readFile(fsSrc));
        this.compile(shaderSources);
    }

    public void compile(Map<Integer, String> shaderSources)
    {
        int program = glCreateProgram();

        List<Integer> shaderIds = new ArrayList<Integer>();
        int shaderIdIdxs = 1;

        for(int i = 0; i < shaderSources.size(); i++)
        {
            int type = i == 0 ? GL_VERTEX_SHADER : i == 1 ? GL_FRAGMENT_SHADER : - 1;
            String source = shaderSources.get(shaderIdIdxs);

            int shader = glCreateShader(type);
            glShaderSource(shader, source);
            glCompileShader(shader);

            int isCompiled = 0;
            isCompiled = glGetShaderi(shader, GL_COMPILE_STATUS);
            if(isCompiled == GL_FALSE)
            {
                int maxLength = 0;
                maxLength = glGetShaderi(shader, GL_INFO_LOG_LENGTH);

                String infoLog = "";
                infoLog = glGetShaderInfoLog(shader, maxLength);
                glDeleteShader(shader);

                String st = type == 0 ? "Vertex Shader" : "Fragment Shader";
                System.out.println("Cannot compile " + st + ": " + infoLog);
                System.exit(-1);
            }

            glAttachShader(program, shader);
            shaderIdIdxs++;
        }

        glLinkProgram(program);

        int isLinked = 0;
        isLinked = glGetProgrami(program, GL_LINK_STATUS);
        if(isLinked == GL_FALSE)
        {
            int maxLength = 0;
            maxLength = glGetProgrami(program, GL_INFO_LOG_LENGTH);

            String infoLog = "";
            infoLog = glGetProgramInfoLog(program, maxLength);

            for(int shaderId : shaderIds)
            {
                glDetachShader(program, shaderId);
            }

            for(int shaderId : shaderIds)
            {
                glDeleteShader(shaderId);
            }

            System.out.println("Cannot link shader program! ");
            System.out.println(infoLog);
            System.exit(-1);

        }

        for(int shaderId : shaderIds)
        {
            glDetachShader(program, shaderId);
        }

        this.programId = program;
    }


    public String readFile(String file)
    {
        boolean appendSlashes = false;
        boolean returnInOneLine = false;
        StringBuilder shaderSource = new StringBuilder();
        try
        {
            InputStream in = Class.class.getResourceAsStream(file);
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;
            while((line = reader.readLine())!=null)
            {
                shaderSource.append(line);

                if(appendSlashes) shaderSource.append("//");
                if(!returnInOneLine) shaderSource.append("\n");
            }
            reader.close();

            return shaderSource.toString();
        }
        catch(IOException e)
        {
            System.out.println("This file '" + file + "' cound be read!");
            e.printStackTrace();
            Runtime.getRuntime().exit(-1);
        }

        return "[Reading Error]: This file '" + file + "' cound be read!";
    }

    public void bind()
    {
        glUseProgram(this.programId);
    }

    public void unBind()
    {
        glUseProgram(0);
    }
}


Это код вершинного шейдера
#version 460 core

layout (location = 0) in vec3 attrib_Position;

out vec3 position;

void main()
{
    position = attrib_Position;
    gl_Position = vec4(attrib_Position, 1.0f);
}


Это код фрагментного шейдера
#version 460 core

layout (location = 0) out vec4 out_Colour;

in vec3 position;

void main()
{
    out_Colour = vec4(position, 1.0f);
}


Моя версия openGl 4.6.0
  • Вопрос задан
  • 205 просмотров
Пригласить эксперта
Ответы на вопрос 1
@serhiops
Python/JavaScript/C++
У тебя location и в вертексном и в фрагментном шейдере равен 0. Дай одному из них номер 1. Советую все-же писать на с++ движок
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы