首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL顶点着色器查找表问题

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

Stack Overflow用户
提问于 2010-11-05 11:24:07
回答 2查看 2.6K关注 0票数 4

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

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

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

代码语言:javascript
复制
//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);    

和我的顶点着色器:

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-05 21:03:52

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

1.-默认的最小过滤器使用mipmap,因此设置纹理不完整。在将纹理绑定到GL_NEAREST之后,设置最小/最大滤镜。2.-你的纹理数据是浮点数,但是你告诉GL它们是无符号字节,把它改成GL_FLOAT。

在此更改之后,您的纹理应该会出现。

票数 3
EN

Stack Overflow用户

发布于 2012-10-24 16:56:02

有一个GLSL命令允许你访问纹理的单个纹理元素,而不需要纹理过滤: texelFetch而不是使用标准化的坐标(0-1),它使用整数,所以texelFetch( 32,32)将获取右侧的32个纹理元素和向下的32个纹理元素。

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

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

几年前,这让我相当头疼。

顺便说一句,我看到你正在尝试渲染一群鱼或别的什么,它看起来很有趣,有没有演示的地方?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4103376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档