Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL Es] Brak koloru w shaderach

Ostatnio zmodyfikowano 2013-09-13 16:36
Autor Wiadomość
golem95
Temat założony przez niniejszego użytkownika
[OpenGL Es] Brak koloru w shaderach
» 2013-09-12 16:14:16
Witajcie!
Mam pewien problem z shaderami, a mianowicie gdy próbuje wczytać kolor za pomocą zwykłej zmiennej to na ekranie nic się nie wyświetla. Natomiast gdy podstawie tam kolor w zwykłych liczbach to program działa normalnie. Ktoś wie może dlaczego się tak dzieję? Poniżej kody obu shaderów:
C/C++
static const char gVertexShader[] =
"attribute vec4 vPosition;\n"
"attribute vec4 vColor;\n"
"out vec4 color;\n"
"void main() {\n"
"  color = vColor;\n"
"  gl_Position = vPosition;\n"
"}\n";

static const char gFragmentShader[] =
"precision mediump float;\n"
"in vec4 color;\n"
"void main() {\n"
"  gl_FragColor = color;\n"
"}\n";
Z góry dziękuje za pomoc.
P-92018
DejaVu
» 2013-09-12 17:49:30
Podaj wywołanie shadera, które działa i to które nie działa.
P-92022
golem95
Temat założony przez niniejszego użytkownika
» 2013-09-12 18:37:08
Nie wiem czy o to chodziło :

C/C++
glUseProgram( gProgram );
glVertexAttribPointer( gvColor, 4, GL_FLOAT, GL_TRUE, 0, colorek );
glVertexAttribPointer( gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, vert );

glEnableVertexAttribArray( gvColor );
glEnableVertexAttribArray( gvPositionHandle );

Z tymi wywołaniami plus powyższe shadery nic się nie wyświetla, lecz gdy w shaderach usune linijki:
C/C++
"attribute vec4 vColor;\n"
"out vec4 color;\n"
//z vertex shadera

"in vec4 color;\n"
"  gl_FragColor = color;\n"
//z fragment shadera

I zamiast gl_FragColor = color wstawię gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) to wtedy normalnie wyświetla mi linie na czerwono

PS. Aha i jeszcze wcześniej wywołuje takie komendy:
C/C++
gvPositionHandle = glGetAttribLocation( gProgram, "vPosition" );
gvColor = glGetAttribLocation( gProgram, "vColor" );
P-92023
DejaVu
» 2013-09-12 19:25:45
No to może złą wartość przekazujesz do gvColor? Kolor to raczej 4 bajty, a nie 4 floaty.

/edit:
Widzę, że w shaderach składowe są przekazywane jako floaty. Poprawny przykład użycia glVertexAttribPointer:
http://en.wikibooks.org/wiki​/OpenGL_Programming​/Modern_OpenGL_Tutorial_03

C/C++
glEnableVertexAttribArray( attribute_v_color );
glBindBuffer( GL_ARRAY_BUFFER, vbo_triangle_colors );
glVertexAttribPointer(
attribute_v_color, // attribute
3, // number of elements per vertex, here (r,g,b)
GL_FLOAT, // the type of each element
GL_FALSE, // take our values as-is
0, // no extra data between each position
0 // offset of first element
);

Tym samym strzelam, że linjka:
C/C++
glVertexAttribPointer( gvColor, 4, GL_FLOAT, GL_TRUE, 0, colorek );
powinna wyglądać tak:
C/C++
glVertexAttribPointer( gvColor, 4, GL_FLOAT, GL_FALSE, 0, colorek );
P-92028
golem95
Temat założony przez niniejszego użytkownika
» 2013-09-13 16:20:06
Powyższa zmiana nie pomogła ale za to dzięki linkowi przypomniałem sobie, że można to zrobić za pomocą uniformów :D. Tak więc dziękuje za pomoc.
P-92064
DejaVu
» 2013-09-13 16:36:37
To napisz chociaż rozwiązanie dla potomnych, które Ci zadziałało :)
P-92066
« 1 »
  Strona 1 z 1