代码之家  ›  专栏  ›  技术社区  ›  jakeva

GLSL顶点着色器查找表问题

  •  4
  • jakeva  · 技术社区  · 14 年前

    坦白地说,我不知道应该使用哪个坐标来获取一维纹理的值。。。但我试过所有的组合。

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

    我的顶点着色器:

    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;
    }
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   Dr. Snoopy    14 年前

    在纹理加载代码中有两个问题:

    2.-你的纹理数据是浮点数,但是你对GL说它们是无符号字节,把它改成GL_FLOAT。

    在这个改变之后你的纹理应该会出现。

        2
  •  1
  •   doelleri    11 年前

    有一个GLSL命令允许您访问纹理的单个纹理,而无需纹理过滤: 它不使用标准化坐标(0-1),而是使用整数,因此texel fetch(32,32)将把texel 32 texel取到右边,并把32texel取下来。

    不过,看起来你写的是老派的GLSL,所以我不知道它有多适用。

    警告:如果你用Nvidia驱动程序在Nvidia卡上编译GLSL程序,它会像CG一样编译,这有一个有趣的警告。 有趣的是,如果尝试使用索引的硬编码值访问足够大的数组的索引(使用纹理作为数组,因此这对您来说应该不是问题),那么它将编译。 但是,如果使用动态索引(变量)访问同一数组的字段,则不会编译该字段。

    这几年前让我很头疼。