GLSL - prosty shader

0

vertex shader

#version 330

uniform mat4 M;
uniform mat4 V;
uniform mat4 P;

in vec4 vertex; //wspolrzedne wierzcholka w przestrzeni modelu

void main(void)
{
	gl_Position=M*V*P*vertex; //oblicz wspolrzedne wierzcholka w przestrzeni przyciecia
}

fragment shader

#version 330

out vec4 pixelColor; //Zmienna wyjsciowa fragment shadera. Zapisuje sie do niej ostateczny (prawie) kolor piksela

void main(void)
{
	pixelColor=vec4(1,0,0,0);
}
 

fragment kodu odpowiedzialny za rysowanie

void drawObject(GLuint vao, ShaderProgram *shaderProgram, mat4 mP, mat4 mV, mat4 mM) {
	//Włączenie programu cieniującego, który ma zostać użyty do rysowania
	//W tym programie wystarczyłoby wywołać to raz, w setupShaders, ale chodzi o pokazanie, 
	//że mozna zmieniać program cieniujący podczas rysowania jednej sceny
	shaderProgram->use();
	
	//Przekaż do shadera macierze P,V i M.
	//W linijkach poniżej, polecenie:
	//  shaderProgram->getUniformLocation("P") 
	//pobiera numer slotu odpowiadającego zmiennej jednorodnej o podanej nazwie
	//UWAGA! "P" w powyższym poleceniu odpowiada deklaracji "uniform mat4 P;" w vertex shaderze, 
	//a mP w glm::value_ptr(mP) odpowiada argumentowi  "mat4 mP;" TYM pliku.
	//Cała poniższa linijka przekazuje do zmiennej jednorodnej P w vertex shaderze dane z argumentu mP niniejszej funkcji
	//Pozostałe polecenia działają podobnie.
	glUniformMatrix4fv(shaderProgram->getUniformLocation("P"),1, false, glm::value_ptr(mP));
	glUniformMatrix4fv(shaderProgram->getUniformLocation("V"),1, false, glm::value_ptr(mV));
	glUniformMatrix4fv(shaderProgram->getUniformLocation("M"),1, false, glm::value_ptr(mM));

	//glUniform4f(shaderProgram->getUniformLocation("lightPos0"), 0,0,-5,1); //Przekazanie współrzędnych źródła światła do zmiennej jednorodnej lightPos0
	
	//Uaktywnienie VAO i tym samym uaktywnienie predefiniowanych w tym VAO powiązań slotów atrybutów z tablicami z danymi
	glBindVertexArray(vao);
	
	//Narysowanie obiektu
	glDrawArrays(GL_TRIANGLES,0,vertexCount);
	
	//Posprzątanie po sobie (niekonieczne w sumie jeżeli korzystamy z VAO dla każdego rysowanego obiektu)
	glBindVertexArray(0);
} 

Dopiero zaczynam zabawe w OpenGLu z shaderami. Przed chwilą pobrałem ze strony dość skomplikowany shader którego nie rozumiem, ale który działał. Uprościłem go sobie. Chciałbym sobie napisać jak najprostszy shader (flatten shader) który tylko przemnaża wierzcholki przez macierz MVP i ustala na sztywno ich kolor. Niestety to co tu napisałem mi nie działa. Dlaczego tak może być?

0

Masz tu cały kod. Jest bardzo prosty. Może będzie ci się chciało go sprawdzić?

0

Już naprawiłem błąd. Miałem złą kolejność mnożenia macierzy. Powinno być:

gl_Position=P*V*M*vertex; //oblicz wspolrzedne wierzcholka w przestrzeni przyciecia

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