GLSL - Невозможно преобразовать из const highp 4-компонентный vec4 в стандартный highp 3-компонентный vec3

Я следую руководству in2gpu.com по OpenGL, и я застрял на шейдерной части. Я читал на форумах об ошибке, но нахожу только случаи, когда люди использовали vec3 как vec4, отсюда и ошибка, но я не думаю, что сделал эту ошибку, по крайней мере, не то, что мне удалось увидеть:

Вершинный шейдер:

#version 430

void main(void) {
    vec4 vertices[3];
    vertices[0] = vec4( 0.25, -0.25, 0.5, 1.0);
    vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0);
    vertices[2] = vec4( 0.25, 0.25, 0.5, 1.0);

   gl_Position = vertices[gl_VertexID];
}

Фрагментный шейдер:

#version 430

out vec3 color;

void main(void) {
    color = vec4(0.0, 1.0, 0.0, 1.0);
}

Ошибка:

Vertex shader failed to compile with the following errors:
ERROR: 0:6: error(#160) Cannot convert from: "const highp 4-component vector of vec4" to: "default out highp 3-component vector of vec3"
ERROR: error(#273) 1 compilation errors.  No code generated


Could not compile shader!

Я пробовал преобразовать данные вершины вот так:

gl_Position = vec4(vertices[gl_VertexID]);
glPosition = vec3(vertices[glVertexID].xyz); (Incase gl_Position was actually a vec3)

но безуспешно.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: загрузчик шейдеров -

public class ShaderLoader {

public static int createShader(String vertexShaderSource, String fragmentShaderSource) {
    int vertex_shader = loadShader(vertexShaderSource, GL20.GL_VERTEX_SHADER);
    int fragment_shader = loadShader(fragmentShaderSource, GL20.GL_FRAGMENT_SHADER);

    int link_result = 0;

    int programID = GL20.glCreateProgram();
    GL20.glAttachShader(programID, vertex_shader);
    GL20.glAttachShader(programID, fragment_shader);

    GL20.glLinkProgram(programID);
    GL20.glValidateProgram(programID);
    GL20.glGetProgrami(programID, link_result);

    if(link_result == GL11.GL_FALSE) {
        System.out.println("Could not link program!");
        System.exit(0);
    }
    return programID;
}

public static int loadShader(String filename, int type) {
    StringBuilder builder = new StringBuilder();
    try {
        BufferedReader reader = new BufferedReader(new FileReader("src/shaders/" + filename));
        String line;
        while((line = reader.readLine()) != null) {
            builder.append(line).append("\n");
        }
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    int shaderID = GL20.glCreateShader(type);
    GL20.glShaderSource(shaderID, builder);
    GL20.glCompileShader(shaderID);
    if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
        System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
        System.out.println("Could not compile shader!");
        System.exit(0);
    }
    return shaderID;
}

}

И в моем основном классе я использую это для его инициализации:

int shaderProgram = ShaderLoader.createShader("vertexShader.txt", "fragmentShader.txt");

РЕДАКТИРОВАТЬ2:

Чтобы проверить, поменялись ли шейдеры местами, я добавил это в myloadShader():

if(type == GL20.GL_VERTEX_SHADER) {
        System.out.println("Vertex: \n" + builder);
    } else if(type == GL20.GL_FRAGMENT_SHADER) {
        System.out.println("Fragment: \n" + builder);
    }

Вывод:

Vertex: 
#version 430

void main(void) {
    vec4 vertices[3];
    vertices[0] = vec4( 0.25, -0.25, 0.5, 1.0);
    vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0);
    vertices[2] = vec4( 0.25, 0.25, 0.5, 1.0);

   gl_Position = vertices[gl_VertexID];
}

Fragment: 
#version 430

out vec4 color;

void main(void) {
    color = vec4(0.0, 1.0, 0.0, 1.0);
}

person Dennis Björk    schedule 27.11.2017    source источник
comment
Не удалось скомпилировать вершинный шейдер Я подозреваю, что у вас также есть ошибка в коде загрузки шейдера. А именно, вы пытались скомпилировать свой фрагментный шейдер как вершинный шейдер.   -  person Nicol Bolas    schedule 27.11.2017
comment
@Nicol Bolas Вау, вы оба были правы, проблема компилятора была решена путем изменения цвета на vec4 - и в моем загрузчике шейдеров я попытался загрузить оба с помощью GL_VERTEX_SHADER! Однако программа не будет ссылаться, я добавлю свой класс ShaderLoader в редактирование! Спасибо вам большое!   -  person Dennis Björk    schedule 28.11.2017
comment
@ Rabbid76 Да, я вставлю немного отладки в свой вопрос выше при редактировании.   -  person Dennis Björk    schedule 28.11.2017
comment
Если это не ссылка, запросите информационный журнал программы и покажите нам сообщение об ошибке. Также: glValidateProgram без проверки результата бесполезно. Я также сомневаюсь, что он делает то, что вы ожидаете: glValidateProgram проверяет, возможна ли команда рисования с текущим состоянием. Это, например, также приведет к ошибке, если VAO отсутствует, связанные сэмплеры не соответствуют программе и так далее. Он НЕ проверяет, успешно ли скомпилирована / скомпилирована программа.   -  person BDL    schedule 28.11.2017


Ответы (1)


Вы неправильно используете функцию getProgrami(). Второй параметр должен сообщить функции, какое значение внутреннего флага вы хотите вернуть, в данном случае это будет GL20.LINK_STATUS. Затем вы должны присвоить возвращаемое значение этой функции вашей переменной link_result. Итак, строка:

GL20.glGetProgrami(programID, link_result);

следует изменить на это:

link_result = GL20.glGetProgrami(programID, GL20.LINK_STATUS);
person anon    schedule 06.01.2020