Opengl - layout -syntax- parse errror

0

Opengl 2.1 + glsl 1.2
Mam taki bład i nie wiem o co chodzi...
Nie mogę załadować shaderów, bo dostaje informacje: layout -syntax- parse errror

#include "libs.h"

static void glfwError(int id, const char* description)
{
	std::cout << description << std::endl;
}

void frameBufferResizeCb(GLFWwindow* window, int fbW, int fbH) 
{
	glViewport(0, 0, fbW, fbH);
}

bool loadShaders(GLuint &program)
{
	bool loadSucess = true;
	char infoLog[512];
	GLint success;

	std::string temp = "";
	std::string src = "";
	//vectors
	std::ifstream in_file;
	in_file.open("vertex_core.glsl");

	if (in_file.is_open())
	{
		while (std::getline(in_file, temp)) {
			src += temp + "\n";
		}
	}
	else {
		std::cout << "ERROR: COULDN'T OPEN VERTEX FILE\n";
		loadSucess = false;
	}
	in_file.close();

	GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
	const GLchar* vertSrc = src.c_str();
	glShaderSource(vertexShader, 1, &vertSrc, NULL);
	glCompileShader(vertexShader);
	glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

	if (!success)
	{
		glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
		std::cout << "ERROR: COULDN'T COMPILE VERTEX SHADER\n" << infoLog << "\n";
		loadSucess = false;
	}
	
	//fragment glsl
	in_file.open("fragment_core.glsl");
	if (in_file.is_open())
	{
		while (std::getline(in_file, temp)) {
			src += temp + "\n";
		}
	}
	else {
		std::cout << "ERROR: COULDN'T OPEN FRAGMENT FILE\n";
		loadSucess = false;
	}
	in_file.close();

	GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	const GLchar* fragSrc = src.c_str();
	glShaderSource(fragmentShader, 1, &fragSrc, NULL);
	glCompileShader(fragmentShader);
	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);

	if (!success)
	{
		glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
		std::cout << "ERROR: COULDN'T COMPILE FRAGMENT SHADER\n" << infoLog << "\n";
		loadSucess = false;
	}

	temp = "";
	src = "";

	//program start
	program = glCreateProgram();
	glAttachShader(program, vertexShader);
	glAttachShader(program, fragmentShader);

	glLinkProgram(program);

	glGetProgramiv(program, GL_LINK_STATUS, &success);
	if (!success)
	{	
		loadSucess = false;
		glGetProgramInfoLog(program, 512, NULL, infoLog);
		std::cout << "ERROR: COULDN'T LINK PROGRAM\n" << infoLog << "\n";
	}
	//end program
	
	glUseProgram(0);
	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);
	return loadSucess;
}

int main()
{
	//glfwSetErrorCallback(&glfwError);

	glfwInit(); //inicjalizacja biblioteki glfw

	const int windowWidth = 640, windowHeight = 480;
	int frameBufferWidth = 0, frameBufferHeight = 0;
	//glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	//glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	//glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
	glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);

	GLFWwindow* window = glfwCreateWindow(windowWidth, windowHeight, "VECTORS VISUALIZATION", NULL, NULL);
	
	//static viewport and buffer for static window
	//glfwGetFramebufferSize(window, &frameBufferWidth, &frameBufferHeight);
	//glViewport(0, 0, frameBufferWidth, frameBufferHeight);
	glfwSetFramebufferSizeCallback(window, frameBufferResizeCb);
	glfwMakeContextCurrent(window); //important
	/*init GLEW*/
	glewExperimental = GL_TRUE; 
	if (glewInit() != GLEW_OK)
	{
		std::cout << "ERROR- GLEW INIT FAILED";
		glfwTerminate();
	}

	//shader init
	GLuint core_program;
	if (!loadShaders(core_program))
	{
		glfwTerminate();
	}

	/*Main Loop*/
	while (!glfwWindowShouldClose(window))
	{
		//update loop
		glfwPollEvents();

		//clear
		glClearColor(0.f, 1.f, 0.f, 1.f);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
		//draw

		//end drawing
		glfwSwapBuffers(window);
		glFlush();
	}

	glfwDestroyWindow(window);
	glfwTerminate();
	glDeleteProgram(core_program);
	return 0;
}

VERTEX-SHADER:

#version 120

layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_color;
layout(location = 2) in vec2 vertex_textcoord;

varying vec3 vs_position;
varying vec3 vs_color;
varying vec2 vs_textcoord;

void main()
{
	vs_position = vertex_position;
	vs_color = vertex_color;
	vs_textcoord = vec2(vertex_textcoord.x, vertex_textcoord.y * -1.f);
	gl_Position = vec4(vertex_position, 1.f);
}

FRAGMETN-SHADER

#version 120

varying vec3 vs_position;
varying vec3 vs_color;
varying vec2 vs_texcoord;

in vec4 fs_color;

void main()
{
	fs_color = vec4(vs_color, 1.f);
}

0
layout(location = 0) in vec3 vertex_position;

attribute zamiast in

in vec4 fs_color;
...
   fs_color = vec4(vs_color, 1.f);

Gdyby to był nowy GLSL, to fs_color byłoby nie in tylko out.
Ale w starym GLSL użyj tutaj po prostu predefiniowanego gl_FragColor.

   glUseProgram(0);

Ale wiesz że to wyłącza shadery zaraz po ich załadowaniu i włączeniu, w efekcie ich nie ma?

1

Wychodzi na to, że w GLSL 1.x nie podaje się tak layout(location = 0), tylko po prostu attribute:

attribute vec3 vertex_position;
attribute vec3 vertex_color;
attribute vec2 vertex_textcoord;

a layout ustawia się z poziomu C, po glCompileShader ale przed glLinkProgram:

glCompileShader(vertexShader);
...
glBindAttribLocation(program, 0, "vertex_position");
glBindAttribLocation(program, 1, "vertex_color");
glBindAttribLocation(program, 2, "vertex_texcoord");
...
glLinkProgram(program);
0

LOOOL
4p.png

0

Co do atrybutów, może jakąś opcję trzeba ustawić w programie, w którym kompilujesz?


UPDATE: Możesz zobaczyć to, może pomoże:

0

Chyba próbujesz vs skompilować jako fs, o czym świadczy błąd o gl_Position.

0
Azarien napisał(a):

Chyba próbujesz vs skompilować jako fs, o czym świadczy błąd o gl_Position.

co to znaczy fs? ja używam wersji x86 do kompilowania, ale nie wiem co to znaczy fs

0

Vertex shader po zmianach dla GLSL 1.2

#version 120
 
attribute vec3 vertex_position;
attribute vec3 vertex_color;
attribute vec2 vertex_textcoord;
 
varying vec3 vs_position;
varying vec3 vs_color;
varying vec2 vs_textcoord;
 
void main()
{
    vs_position = vertex_position;
    vs_color = vertex_color;
    vs_textcoord = vec2(vertex_textcoord.x, vertex_textcoord.y * -1.f);
    gl_Position = vec4(vertex_position, 1.f);
}

Fragment shader po zmianach:

#version 120
 
varying vec3 vs_position;
varying vec3 vs_color;
varying vec2 vs_texcoord;
 
void main()
{
    gl_FragColor = vec4(vs_color, 1.f);
}

Nie sprawdzane.

a gdzie takie coś znalazłeś?

Tu są opasłe PDF-y ze specyfikacją wszystkich wersji:
https://www.khronos.org/registry/OpenGL/index_gl.php

Opis wszystkich funkcji z wersji 2.1:
https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/
i dla porównania 4.5 core profile:
https://www.khronos.org/registry/OpenGL-Refpages/gl4/

0

bez tego in?
attribute vec3 vertex_position;
attribute **in **vec3 vertex_color;
attribute **in **vec2 vertex_textcoord;

whatever,
no chyba coś się nie kompiluje do fragment shader, spróbuje naprawić
4p.png

1

Te błędy nadal sugerują, że to jest vertex shader którego próbujesz skompilować jako fragment shader.
Zastanów się w którym shaderze masz gl_Position.

0

dobra, problem się rozwiazał,
nie wyczyściełm
temp = "";
sprawdzałem to raz ale w sumie nie sprawdziłem .. i teraz działa, dziękuje bardzo za pomoc,
Panowie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1