2014-08-28 6 views
1

Я хочу использовать 1d текстуру (цветовой рамп) для текстуры простого треугольника.Отображение текстуры с использованием 1d-текстуры с OpenGL 4.x

enter image description here

Мой пиксельный шейдер выглядит следующим образом:

#version 420 

uniform sampler1D   colorRamp; 
in float height; 

out vec4 FragColor; 

void main() 
{ 
    FragColor = texture(colorRamp, height).rgba; 
} 

Моего вершинный шейдер выглядит следующим образом:

#version 420 

layout(location = 0) in vec3 position; 

out float height; 

void main() 
{ 
    height = (position.y + 0.75f)/(2 * 0.75f); 
    gl_Position = vec4(position, 1.0); 
} 

При рисовании треугольника я продолжу этот путь (я удалил проверку ошибок код формы для лучшей читаемости):

glUseProgram(program_); 

GLuint samplerLocation = glGetUniformLocation(program_, name.toCString()); 
glUniform1i(samplerLocation, currentTextureUnit_); 

glActiveTexture(GL_TEXTURE0 + currentTextureUnit_); 
glBindTexture(GL_TEXTURE_1D, textureId); 

К сожалению, мой треугольник только черный. Есть идеи, как решить эту проблему?

Я уверен, что назначенная текстура заполнена соответствующими данными, так как я прочитал ее с помощью glGetTexImage и проверил ее. Нужно ли мне вызывать другие функции для привязки и активации текстуры? У меня почти такой же код для 2d текстур, который работает.

При изменении кода шейдера так:

#version 420 

uniform sampler1D   colorRamp; 
in float height; 

out vec4 FragColor; 

void main() 
{ 
    FragColor = vec4(height, height, height, 1.0); // change! 
} 

я получаю этот выход: enter image description here

Я приготовила демо исходный код, который воспроизводит ошибку. Источник можно найти here. Он генерирует следующий вывод:

enter image description here

1d текстура создается таким образом - только с красными пикселями:

static GLuint Create1DTexture() 
{ 
    GLuint textureId_; 

    // generate the specified number of texture objects 
    glGenTextures(1, &textureId_); 
    assert(glGetError() == GL_NO_ERROR); 

    // bind texture 
    glBindTexture(GL_TEXTURE_1D, textureId_); 
    assert(glGetError() == GL_NO_ERROR); 

    // tells OpenGL how the data that is going to be uploaded is aligned 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    assert(glGetError() == GL_NO_ERROR); 

    float data[] = 
    { 
     1.0f, 0.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 1.0f 
    }; 

    glTexImage1D(
     GL_TEXTURE_1D,  // Specifies the target texture. Must be GL_TEXTURE_1D or GL_PROXY_TEXTURE_1D. 
     0,     // Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. 
     GL_RGBA32F, 
     3*sizeof(float)*4, 
     0,     // border: This value must be 0. 
     GL_RGBA, 
     GL_FLOAT, 
     data 
    ); 
    assert(glGetError() == GL_NO_ERROR); 

    // texture sampling/filtering operation. 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    assert(glGetError() == GL_NO_ERROR); 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    assert(glGetError() == GL_NO_ERROR); 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    assert(glGetError() == GL_NO_ERROR); 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    assert(glGetError() == GL_NO_ERROR); 

    glBindTexture(GL_TEXTURE_1D, 0); 
    assert(glGetError() == GL_NO_ERROR); 

    return textureId_; 
} 

текстуры связывания сделана таким образом:

GLuint samplerLocation = glGetUniformLocation(rc.ToonHandle, "ColorRamp"); 
glUniform1i(samplerLocation, 0); 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_1D, rc.texure1d); 
+1

Показать вершинный шейдер. Правильно ли он устанавливает высоту? Вы уверены, что проходите нормализованную высоту? Также я предлагаю использовать '.rgba', понятно, что вы говорите о текстурах/цветах. –

+2

Слишком много вещей, которые вы могли бы сделать неправильно. Полная текстура? Вы уверены в координатах? Вы пробовали «живопись высоты» по f.i. назначая другой оттенок красного между его значением 0 и 1 и как зеленый вне этого диапазона? Что сообщает 'GL_KHR_debug'? – peppe

+0

@BartekBanachewicz Я поменял postiong на ваши предложения! – Vertexwahn

ответ

1

Найдено ошибок:

glTexImage1D(
    GL_TEXTURE_1D,  // Specifies the target texture. Must be GL_TEXTURE_1D or GL_PROXY_TEXTURE_1D. 
    0,     // Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image. 
    GL_RGBA32F, 
    3/*3*sizeof(float)*4*/, // bug fix!!!! 
    0,     // border: This value must be 0. 
    GL_RGBA, 
    GL_FLOAT, 
    data 
); 
+0

Да, четвертым параметром является ширина текстуры в пикселях. Кажется, вы ошиблись с размером в байтах. – glampert

+0

В моем реальном приложении эта ошибка не возникает - я использую объекты сэмплера в реальном приложении, и кажется, что 1d-текстура не работает со всеми типами объектов сэмплера. – Vertexwahn

Смежные вопросы