Вопрос о таблице соответствия GLSL Vertex Shader - PullRequest
4 голосов
/ 05 ноября 2010

У меня возникли некоторые трудности при отладке моей программы. Я пытаюсь использовать массив в качестве таблицы поиска, чтобы сместить местоположение вершины в моем вершинном шейдере, но я даже не могу сказать, правильно ли я связываю свой массив. Коэффициент смещения всегда заканчивается нулем (сглаживая мои векторы, а не придавая им форму), поэтому либо я получаю неправильные координаты 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;
}

Ответы [ 2 ]

3 голосов
/ 05 ноября 2010

В коде загрузки текстур есть две проблемы:

1.- Фильтр MIN по умолчанию использует мип-карты, поэтому с этой настройкой текстура будет неполной. Установите фильтры MIN / MAG после привязки текстуры к GL_NEAREST. 2.- Ваши данные текстуры являются плавающими, но вы говорите GL, что они являются байтами без знака, измените их на GL_FLOAT.

После этих изменений должна появиться ваша текстура.

1 голос
/ 24 октября 2012

Существует команда GLSL, которая позволяет вам получить доступ к отдельным текстам текстуры, без фильтрации текстур: texelFetch Вместо использования нормализованных координат (0-1) используются целые числа, поэтому texelFetch (32, 32) извлекаетtexel 32 texel справа и 32 texels вниз.

Похоже, что вы пишете довольно старый школьный GLSL, поэтому я не знаю, насколько это применимо.

Предупреждение: ЕслиВы компилируете свои программы GLSL на карту Nvidia, с драйверами Nvidia, она будет скомпилирована, как это было CG, что имеет забавную оговорку.Интересно, что если вы попытаетесь получить доступ к индексу достаточно большого массива (вы используете текстуру в качестве массива, так что это не должно быть для вас проблемой), используя жестко закодированное значение для индекса, он скомпилируется.Однако, если вы используете динамический индекс (переменную) для доступа к полю того же массива, он не скомпилируется.Причина в том, что компилятор Nvidias оптимизирует все неиспользуемые индексы (поскольку вы используете жестко закодированное значение, компилятор считает, что он может отбросить другие значения массива)!

Это вызвало у меня некоторую головную больлет назад.

Между прочим, я вижу, что вы пытаетесь создать школу рыб или что-то, это выглядит интересно, в любом месте, где у вас есть демо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...