GLSL Vertex Shader lookup-table question

I've got some difficulty debugging my program. I'm trying use an array as a lookup table to offset the vertex location in my vertex shader, but I can't even tell if I'm linking my array correctly. The offset factor always ends up zero (flattening my vectors, rather than giving them a shape), so either I'm accessing the texture1D coordinates wrong or the array isn't binding right to the texture.

Frankly, I don't know which coordinates I should be using to get the values from a 1D texture... but I've tried all the combinations.

Here I setup the array and bind it to the shader:

//FISH
GLfloat fish_coords[100];
for (int i = 0; i < 50; i++){fish_coords[i] = 0;}
for (int i = 50; i < 100; i++){fish_coords[i] = 1;}
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glGenTextures(1, &fishtexture);  
glBindTexture(GL_TEXTURE_1D, fishtexture);
glTexImage1D(GL_TEXTURE_1D, 0, 1, 128,0,GL_RGBA, GL_UNSIGNED_BYTE, &fish_coords);

switch(shadow_selection){
case 0: 
    vertexShader = "fish.vert";
    fragmentShader = "fish.frag";
    setShaders();

    GLint loc1;
    loc1 = glGetUniformLocation(shaderProgram,"fish_coords");
    glUniform1i(loc1,0);    

And my vertex shader:

uniform float spec_factor;
uniform sampler1D fish_coords;

varying vec3 lightDir,normal;

void main()
{

    vec4 v_pos;
    vec3 ldir;

    gl_TexCoord[0] = gl_MultiTexCoord0;

    v_pos = gl_ModelViewMatrix * gl_Vertex;
    ldir = vec3(gl_LightSource[0].position-v_pos);
    lightDir = normalize(ldir);
    normal = normalize(gl_NormalMatrix * gl_Normal);

    vec4 offset;
    offset = texture1D(fish_coords, gl_TexCoord[0].r);

    vec4 fish_shape;
    fish_shape.xz = gl_Vertex.xz;
    fish_shape.y = gl_Vertex.y * offset.x;
    fish_shape.w = 1;

    gl_Position = gl_ModelViewProjectionMatrix * fish_shape;
}

Answers


There are two problems in your texture loading code:

1.- The default MIN filter uses mipmaps, so with that setup the texture incomplete. Set the MIN/MAG filters after binding the texture to GL_NEAREST. 2.- Your texture data is floats, but you say to GL they are unsigned bytes, change that to GL_FLOAT.

After this changes your texture should appear.


Need Your Help

IoC Container accessibility

mvvm inversion-of-control containers service-locator

I'm wondering if the IoC Container should be referenced only by the class that instantiates and configures it, or if it can be injected into other classes, VMs and VML for example. I'm asking becau...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.