调试程序时遇到了一些困难。我正在尝试使用数组作为查找表来偏移顶点着色器中的顶点位置,但我甚至无法判断我是否正确链接了我的数组。偏移因子总是最终为零(展平我的向量,而不是给它们一个形状),所以要么我正在访问texture1D坐标错误,要么数组没有绑定到纹理。
坦率地说,我不知道我应该使用哪个坐标来获取1D纹理的值......但我已经尝试了所有组合。
这里我设置数组并将其绑定到着色器:
//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;
}
答案 0 :(得分:3)
纹理加载代码中存在两个问题:
1.-默认MIN过滤器使用mipmap,因此使用该设置时纹理不完整。将纹理绑定到GL_NEAREST后设置MIN / MAG过滤器。 2.-您的纹理数据是浮点数,但是您对GL说它们是无符号字节,将其更改为GL_FLOAT。
在此更改后,您的纹理应该出现。
答案 1 :(得分:1)
有一个GLSL命令允许您访问纹理的单个纹素,而不需要纹理过滤: texelFetch 它不使用标准化坐标(0-1),而是使用整数,因此texelFetch(32,32)将向右提取纹素32纹素,向下提取32个纹素。
看起来你正在编写漂亮的旧学校GLSL,所以我不知道它有多适用。
警告:如果您正在使用Nvidia驱动程序在Nvidia卡上编译您的GLSL程序,它将像CG一样进行编译,这有一个有趣的警告。 有趣的是,如果您尝试访问一个足够大的数组的索引(您使用纹理作为数组,因此对您来说不应该是一个问题)使用索引的硬编码值,它将进行编译。 但是,如果使用动态索引(变量)访问同一数组的字段,则无法编译。 原因是Nvidias编译器优化了所有未使用的索引(因为您使用的是硬编码值,编译器认为它可以丢弃其他数组值)!
几年前这让我很头疼。
顺便说一下,我看到你正试图渲染一堆鱼或什么东西,看起来很有趣,你有演示的地方吗?