Opengl GLSL顶点着色器查找表问题

Opengl GLSL顶点着色器查找表问题,opengl,glsl,shader,textures,render-to-texture,Opengl,Glsl,Shader,Textures,Render To Texture,调试我的程序有点困难。我尝试使用数组作为查找表来偏移顶点着色器中的顶点位置,但我甚至无法判断是否正确链接了数组。偏移因子总是以零结束(展平向量,而不是给它们一个形状),因此要么我访问了texture1D坐标错误,要么数组没有正确绑定到纹理 坦白地说,我不知道应该使用哪个坐标从一维纹理中获取值。。。但我试过所有的组合 在这里,我设置数组并将其绑定到着色器: //FISH GLfloat fish_coords[100]; for (int i = 0; i < 50; i++){fish_c

调试我的程序有点困难。我尝试使用数组作为查找表来偏移顶点着色器中的顶点位置,但我甚至无法判断是否正确链接了数组。偏移因子总是以零结束(展平向量,而不是给它们一个形状),因此要么我访问了texture1D坐标错误,要么数组没有正确绑定到纹理

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

在这里,我设置数组并将其绑定到着色器:

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

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

1.-默认的最小过滤器使用mipmaps,因此设置纹理不完整。将纹理绑定到最近的GL_后,设置最小/最大过滤器。 2.-你的纹理数据是浮动的,但你对GL说它们是无符号字节,将其更改为GL_浮动


更改后,您的纹理将显示。

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

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

警告:如果你在NVIDIA卡上编译你的GLSL程序,和英伟达的驱动程序,它会像CG一样编译,这有一个有趣的警告。 有趣的是,如果您尝试使用索引的硬编码值访问足够大的数组的索引(您使用的是纹理作为数组,因此这对您来说应该不是问题),它将编译。 但是,如果使用动态索引(变量)访问同一数组的字段,它将不会编译。 原因是Nvidias编译器优化了所有未使用的索引(因为您使用的是硬编码值,编译器认为它可以丢弃其他数组值)

几年前,这让我很头疼


顺便说一句,我看到你正在尝试渲染一组鱼或其他东西,它看起来很有趣,你有演示的地方吗

快速回答是:这不是加载纹理的方式。绑定按id选择要对其进行操作的纹理。你用GlgenTexture分配ID,绑定它们,加载它们(比如用glTexImage1D),然后使用它们。啊,我认为查找表是对纹理的一种攻击,所以我没有这么做。谢谢。好吧,既然改变了。。。我不会再靠近了。啊!非常感谢。这正是我需要解决的问题。
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;
}