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: 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. |
|
DejaVu |
» 2013-09-12 17:49:30 Podaj wywołanie shadera, które działa i to które nie działa. |
|
golem95 Temat założony przez niniejszego użytkownika |
» 2013-09-12 18:37:08 Nie wiem czy o to chodziło : 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: "attribute vec4 vColor;\n" "out vec4 color;\n"
"in vec4 color;\n" " gl_FragColor = color;\n"
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: gvPositionHandle = glGetAttribLocation( gProgram, "vPosition" ); gvColor = glGetAttribLocation( gProgram, "vColor" ); |
|
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_03glEnableVertexAttribArray( attribute_v_color ); glBindBuffer( GL_ARRAY_BUFFER, vbo_triangle_colors ); glVertexAttribPointer( attribute_v_color, 3, GL_FLOAT, GL_FALSE, 0, 0 );
Tym samym strzelam, że linjka: glVertexAttribPointer( gvColor, 4, GL_FLOAT, GL_TRUE, 0, colorek );
powinna wyglądać tak: glVertexAttribPointer( gvColor, 4, GL_FLOAT, GL_FALSE, 0, colorek );
|
|
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. |
|
DejaVu |
» 2013-09-13 16:36:37 To napisz chociaż rozwiązanie dla potomnych, które Ci zadziałało :) |
|
« 1 » |