• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Opengl - shader nie działa

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
344 wizyt
pytanie zadane 6 lutego 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)

Witam, od niedawna bawię się w opengl, i mam taki kod funkcji: 

GLint loadShader(std::string wayToVertexShader, std::string wayToFragmentShader)
{
	//nadaje id shaderowi
	GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
	GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

	std::string vertexShaderData;
	std::ifstream vertexShaderFile(wayToVertexShader);

	if (vertexShaderFile.is_open())
	{
		std::string line;
		while (std::getline(vertexShaderFile, line))
		{
			vertexShaderData += "\n" + line;
		}
		vertexShaderFile.close();
	}

	std::string fragmentShaderData;
	std::ifstream fragmentShaderFile(wayToFragmentShader);

	if (vertexShaderFile.is_open())
	{
		std::string line;
		while (std::getline(fragmentShaderFile, line))
		{
			fragmentShaderData += "\n" + line;
		}
		fragmentShaderFile.close();
	}

	const char *vertexPTR = vertexShaderData.c_str();
	const char *fragmentPTR = fragmentShaderData.c_str();

	//wstaria kod rudøowy shadera do niego
	glShaderSource(vertexShader, 1, &vertexPTR, NULL);
	glShaderSource(fragmentShader, 1, &fragmentPTR, NULL);

	//kompiluje shader
	glCompileShader(vertexShader);
	glCompileShader(fragmentShader);

	//tworzy obiekt i jego identyfikator 
	GLuint shaderPrograme = glCreateProgram();

	//dodaje shadery do programy ^ 
	glAttachShader(shaderPrograme, vertexShader);
	glAttachShader(shaderPrograme, fragmentShader);

	//łączy shadery
	glLinkProgram(shaderPrograme);

	//usuwa zajętą pamięć 
	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);

	//identyfikator obiektu
	return shaderPrograme;
}

i wywołanie:

GLuint shader = loadShader("C:\Shaders\vertexShader.glsl", "C:\Shaders\fragmentShader.glsl");

	while (!glfwWindowShouldClose(window))
	{
		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

		glUseProgram(shader);

		glBindVertexArray(vao);
		glDrawArrays(GL_TRIANGLES, 0, 6);


		glfwSwapBuffers(window);
		glfwPollEvents();
	}

Oraz takie kody shaderów:

vertexShader:

#version 303

layout(location = 0) in vec3 vp;

void main()
{
	gl_Position = vec4(vp, 1.0);
}

i fragment shader:

#version 303

out vec4 frag_colour;

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



i nie wiem dlaczego kwadrat(a raczej 2 trójkąty) nadal są białe

1 odpowiedź

0 głosów
odpowiedź 9 lutego 2016 przez Kaze47 Obywatel (1,700 p.)
wybrane 9 lutego 2016 przez Avernis
 
Najlepsza

spróbuj ścieżkę do pliku zapisać z dwoma backslashami

C:\\...

i popraw wersje shadera #version 303 na #version 330

komentarz 9 lutego 2016 przez Avernis Nałogowiec (27,400 p.)
już dawno naprawiłem, ale dzięki za chęć pomocy, mam jednak inny problem jeśli chcesz się "pobawić"
komentarz 9 lutego 2016 przez Kaze47 Obywatel (1,700 p.)
dawaj ^^ pomyslimy cos nad nim :)
komentarz 9 lutego 2016 przez Avernis Nałogowiec (27,400 p.)

Mam kod stąd: https://github.com/qbranchmaster/KursOpenGL/tree/master/7_VBO

i takie mam kody:

#include <GL/glew.h>
#include <glfw3.h>
#include <iostream>
#include <fstream>
#include <string>

void glfwInitialization()
{
	if (!glfwInit())
	{
		std::cout << "Error with initialization glfw library" << std::endl;
		glfwTerminate();

		return;
	}
}
void glewInitialization()
{
	if (glewInit() != GLEW_OK)
	{
		std::cout << "Error with initialization glew library" << std::endl;

		return;
	}
}

GLint loadShader(std::string wayToVertexShader, std::string wayToFragmentShader)
{
	//jaki shader chcemy zrobić
	GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
	GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);

	std::string vertex_shader_data;
	std::ifstream vertexShaderFile(wayToVertexShader.c_str(), std::ios::in);
	if (vertexShaderFile.is_open())
	{
		std::string line;
		while (std::getline(vertexShaderFile, line))
			vertex_shader_data += "\n" + line;

		vertexShaderFile.close();
	}

	std::string fragment_shader_data;
	std::ifstream fragmentShaderFile(wayToFragmentShader.c_str(), std::ios::in);
	if (fragmentShaderFile.is_open())
	{
		std::string line;
		while (std::getline(fragmentShaderFile, line))
			fragment_shader_data += "\n" + line;

		fragmentShaderFile.close();
	}

	const char *vertex_ptr = vertex_shader_data.c_str();
	const char *fragment_ptr = fragment_shader_data.c_str();

	//wstawia kod shadera do obiektu shadera
	glShaderSource(vertexShaderId, 1, &vertex_ptr, NULL);
	glShaderSource(fragmentShaderId, 1, &fragment_ptr, NULL);

	//kompiluje shadery
	glCompileShader(vertexShaderId);
	glCompileShader(fragmentShaderId);

	//tworzy program sahdera
	GLuint shaderProgram = glCreateProgram();

	//łączy shadery
	glAttachShader(shaderProgram, vertexShaderId);
	glAttachShader(shaderProgram, fragmentShaderId);

	//dodaje shadery do programu
	glLinkProgram(shaderProgram);

	//usuwa zajętą pamięć
	glDeleteShader(vertexShaderId);
	glDeleteShader(fragmentShaderId);

	return shaderProgram;
}

int main()
{
	glfwInitialization();


	GLFWwindow* window = glfwCreateWindow(800, 600, "", NULL, NULL);
	glfwMakeContextCurrent(window);

	glewInitialization();

	GLuint shader = loadShader("C:/Shaders/vertexShader.glsl", "C:/Shaders/fragmentShader.glsl");

	GLfloat triangle[] = { 
	   -0.5f, -0.5f, 0.0f,
		0.0f,  0.5f, 0.0f,
		0.5f, -0.5f, 0.0f,
						};
	GLfloat colours[] = {
		1.0f,  0.0f, 0.0f,
		0.0f,  1.0f, 0.0f,
		0.0f,  0.0f, 1.0f,
	};

	GLuint positionVbo = 0;
	//zapisuje do zmiennej vbo liczbę listę liczb całkowitych zbudowanych z wolnych buforów
	glGenBuffers(1, &positionVbo);
	//ustala wykonanie akscji na danej zmiennej
	glBindBuffer(GL_ARRAY_BUFFER, positionVbo);
	//przygotowywuje program do wykonania czynności
	glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);

	GLuint coloursVbo = 0;
	//zapisuje do zmiennej vbo liczbę listę liczb całkowitych zbudowanych z wolnych buforów
	glGenBuffers(1, &coloursVbo);
	//ustala wykonanie akscji na danej zmiennej
	glBindBuffer(GL_ARRAY_BUFFER, coloursVbo);
	//przygotowywuje program do wykonania czynności
	glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW);

	GLuint vao = 0;
	//działa tak samo jak glGenBuffers
	glGenVertexArrays(1, &vao);
	//uaktywnia tablicę vao
	glBindVertexArray(vao);
	//ustala wykonanie akcji na danej zmiennej
	glBindBuffer(GL_ARRAY_BUFFER, positionVbo);
	//definiuje cechy figury
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
	//
	glBindBuffer(GL_ARRAY_BUFFER, coloursVbo);
	//
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
	//możliwość kożystania z glVertexAttribPointer
	glEnableVertexAttribArray(0);
	glEnableVertexAttribArray(1);

	while (!glfwWindowShouldClose(window))
	{
		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

		glUseProgram(shader);
		glBindVertexArray(vao);
		glDrawArrays(GL_TRIANGLES, 0, 3);

		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	glfwDestroyWindow(window);
	glfwTerminate();

	return 0;
}

i shadery:

fragment:

#version 330

in vec3 vertexColour;
out vec4 fragmentColour;

void main()
{
	fragmentColour = vec4(vertexColour, 1.0);
}



vertex:

#version 330

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 colour;

out vec3 vertex_colour;

void main()
{
	vertex_colour = colour;
	gl_Position = vec4(position.x, position.y, position.z, 1.0);
}

I trójkąt jest ciągle biały

komentarz 9 lutego 2016 przez Kaze47 Obywatel (1,700 p.)
edycja 9 lutego 2016 przez Kaze47
fragment shader
#version 330
 
in vec3 vertex_colour;
out vec4 fragmentColour;
 
void main()
{
    fragmentColour = vec4(vertex_colour, 1.0);
}

 

 

komentarz 9 lutego 2016 przez Avernis Nałogowiec (27,400 p.)
nie rozumiem co mam zrobic?
komentarz 9 lutego 2016 przez Kaze47 Obywatel (1,700 p.)
zmienna wyjsciowa z vertex shader musi tak samo sie nazywac jak zmienna wejsciowa fragment shader
komentarz 9 lutego 2016 przez Avernis Nałogowiec (27,400 p.)
dzięki, działa

Podobne pytania

0 głosów
0 odpowiedzi 141 wizyt
0 głosów
0 odpowiedzi 162 wizyt
pytanie zadane 31 października 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
0 odpowiedzi 253 wizyt
pytanie zadane 23 maja 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)

93,093 zapytań

142,054 odpowiedzi

321,493 komentarzy

62,435 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...