В коде у мня так:
При инициализации
//glBindAttribLocation(shaderProgram, ATTRIB_TEXTURE, "texture"); uniforms[UNIFORM_TEXTURE]=glGetUniformLocation(shaderProgram, "texture"); glUniform1i(uniforms[UNIFORM_TEXTURE], texture);
при рисовании кадра
glUniform1f(uniforms[UNIFORM_TEXTURE], texture); glBindTexture(GL_TEXTURE_2D,texture ); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
uniforms[UNIFORM_TEXTURE] - enum int"ов
shader.fs uniform sampler2D texture; void main() { // gl_FragColor = vec3(1.0,0.0,0.0,1.0) q; gl_FragColor = tex2D(texture, gl_TexCoord[0].st); }
shader.vs #version 120 attribute vec4 position; uniform float translate; void main() { gl_Position = position; gl_Position.x += sin(translate) / 2.0; }
log:
start shadersShader compile log:
ERROR: 0:2: 'attribute' : supported in vertex shaders only
ERROR: 0:7: 'gl_Position' : undeclared identifier
ERROR: 0:7: 'assign' : cannot convert from 'attribute 4-component vector of float' to 'float'
ERROR: 0:8: 'y' : field selection requires structure or vector on left hand side
SIF
> ERROR: 0:2: 'attribute' : supported in vertex shaders only
Вот это не понятно. Будто вершинный шейдер загружен как пиксельный
Возможно немного коряво,но вот код загрузки шейдеров:
void loadshaders() { GLuint vertShaderObject,fragShaderObject;//,shaderProgram; GLchar* listingFragShader= loadShaderSource("shader.fs"); GLchar* listingVertShader=loadShaderSource("shader.vs"); //printf("\nVertex shader ... \n %s \n", listingVertShader); //printf("Fragment shader ... \n %s \n", listingFragShader); glShaderSource( vertShaderObject, 1, reinterpret_cast<const char** >(listingVertShader), NULL ); glShaderSource( fragShaderObject, 1, reinterpret_cast<const char** >(listingFragShader), NULL ); compileShader(vertShaderObject, GL_VERTEX_SHADER,listingVertShader ); compileShader(fragShaderObject, GL_FRAGMENT_SHADER,listingVertShader ); shaderProgram = glCreateProgram(); glAttachShader( shaderProgram, vertShaderObject ); glAttachShader( shaderProgram, fragShaderObject ); glBindAttribLocation(shaderProgram, ATTRIB_VERTEX, "position"); if(!linkProgram(shaderProgram)) printf("error LINK!!!"); validateProgram(shaderProgram); glUseProgram(shaderProgram); uniforms[UNIFORM_TRANSLATE] = glGetUniformLocation(shaderProgram, "translate"); glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); glEnableVertexAttribArray(ATTRIB_VERTEX); //glBindAttribLocation(shaderProgram, ATTRIB_TEXTURE, "texture"); uniforms[UNIFORM_TEXTURE]=glGetUniformLocation(shaderProgram, "texture"); glUniform1i(uniforms[UNIFORM_TEXTURE], 0); }
И надо сказать,что версия GLSL 1.2
Новую версию, к сожалению, моя ОС не поддерживает
а как же процедура compileShader выглядит ??
bool compileShader(GLuint shader, GLenum type, const GLchar *source) { GLint status; shader = glCreateShader(type); glShaderSource(shader, 1, &source, NULL); glCompileShader(shader); GLint logLength; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); if (logLength > 0) { GLchar *log = (GLchar *)malloc(logLength); glGetShaderInfoLog(shader, logLength, &logLength, log); printf("Shader compile log:\n%s", log); free(log); } glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if (status == 0) { glDeleteShader(shader); return FALSE; } return TRUE; }
интересно... так я и думал
bool compileShader(GLuint shader, GLenum type, const GLchar *source)
может так?
bool compileShader(GLuint &shader, GLenum type, const GLchar *source)
а то будет 2 раза какой-нибудь шейдер или вообще ничего не будет, и на линковке сдохнет
а ещё:
compileShader(vertShaderObject, GL_VERTEX_SHADER, listingVertShader );
compileShader(fragShaderObject, GL_FRAGMENT_SHADER, listingFragShader );
очепятка =)
блинаа…сам поражаюсь своей тупости! =(
теперь всё ок.…кроме того что текстура не накладывается,но думаю что скоро решу…
upd:хмм, странно
gl_FragColor = vec4(1.0,1.0,0.0,1.0);
gl_FragColor = texture2D(texture, gl_TexCoord[0].st);
при первом есть желтый цвет, а при втором розовый о_0
SIF
> При инициализации
> glUniform1i(uniforms[UNIFORM_TEXTURE], texture);
> при рисовании кадра
> glUniform1f(uniforms[UNIFORM_TEXTURE], texture);
В обоих случаях надо:
glUniform1i(uniforms[UNIFORM_TEXTURE], 0);
Блин, ты хоть книжку какую почитай, чего чо попало делаешь.
Тема в архиве.