ПрограммированиеФорумГрафика

Помогите исправить.GLSL 1.2,opengl 2.1.Текстурирование (2 стр)

Страницы: 1 2
#15
13:06, 23 янв 2011

В коде у мня так:
При инициализации

  //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

#16
13:44, 23 янв 2011

SIF
> ERROR: 0:2: 'attribute' :  supported in vertex shaders only 

Вот это не понятно.  Будто вершинный шейдер загружен как пиксельный

#17
13:56, 23 янв 2011

Возможно немного коряво,но вот код загрузки шейдеров:

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
Новую версию, к сожалению, моя ОС не поддерживает

#18
14:27, 23 янв 2011

а как же процедура compileShader выглядит ??

#19
14:32, 23 янв 2011
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;
}
#20
14:45, 23 янв 2011

интересно... так я и думал
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 );

очепятка =)

#21
14:56, 23 янв 2011

блинаа…сам поражаюсь своей тупости! =(
теперь всё ок.…кроме того что текстура не накладывается,но думаю что скоро решу…
upd:хмм, странно
gl_FragColor = vec4(1.0,1.0,0.0,1.0);
  gl_FragColor = texture2D(texture, gl_TexCoord[0].st);
при первом есть желтый цвет, а при втором розовый о_0

#22
16:38, 23 янв 2011

SIF
> При инициализации
> glUniform1i(uniforms[UNIFORM_TEXTURE], texture);
> при рисовании кадра
> glUniform1f(uniforms[UNIFORM_TEXTURE], texture);

В обоих случаях надо:
glUniform1i(uniforms[UNIFORM_TEXTURE], 0);

Блин, ты хоть книжку какую почитай, чего чо попало делаешь.

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.