OpenGL: проблема с использованием 2D-текстуры с высотой 1 - PullRequest
0 голосов
/ 26 сентября 2019

Я ищу одномерную текстуру, содержащую значения RGB в фрагментном шейдере.Поскольку реализация должна быть совместима с OpenGL ES 3.0, я не могу использовать настоящую 1D текстуру, но попробуйте использовать 2D текстуру с высотой 1.

Вот как я ее реализовал:

Инициализация текстуры

glPixelStorei   (GL_UNPACK_ALIGNMENT,  1);
glPixelStorei   (GL_UNPACK_ROW_LENGTH, numColours);
glGenTextures   (1, &colourScaleTexture);
glActiveTexture (colourScaleTextureUnit);
glBindTexture   (GL_TEXTURE_2D, colourScaleTexture);
glTexImage2D    (GL_TEXTURE_2D, 0, GL_RGB, numColours, 1, 0, GL_RGB, GL_FLOAT, colourScale);

Визуализация обратного вызова

// Set texture wrapping and interpolation mode
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glActiveTexture (colourScaleTextureUnit);
glBindTexture (GL_TEXTURE_2D, colourScaleTexture);
surfaceShader->uniforms->colourScale->set (1); // Texture unit 1

// Enable a second other texture used in the vertex shader
glActiveTexture (matrixDataTextureUnit);
glBindTexture  (GL_TEXTURE_2D, matrixDataTexture);
surfaceShader->uniforms->matrixToPlot->set (0); // Texture unit 0

glDrawElements (GL_TRIANGLE_STRIP, surfaceVertexIndexBufferSize, GL_UNSIGNED_INT, 0);

Фрагмент шейдера

// depending on the platform #version 330 (Desktop) or #version 300 es and a precision specifier (OpenGL ES) will be prepended

in      float     vGraphHeight;
uniform sampler2D uColourScale;
out     vec4      fragColor;

void main (void)
{
    fragColor = vec4 (texture (uColourScale, vec2 (vGraphHeight, 0.0)).rgb, 1.0);
}

Что происходит: цвет фрагмента черный.Однако я случайно изменил инициализацию текстуры на эту, и она неожиданно сработала на моем настольном компьютере под не-ES OpenGL 3.2:

glPixelStorei   (GL_UNPACK_ALIGNMENT,  1);
glPixelStorei   (GL_UNPACK_ROW_LENGTH, numColours);
glGenTextures   (1, &colourScaleTexture);
glActiveTexture (colourScaleTextureUnit);
glBindTexture   (GL_TEXTURE_1D, colourScaleTexture); <-- Here
glTexImage2D    (GL_TEXTURE_2D, 0, GL_RGB, numColours, 1, 0, GL_RGB, GL_FLOAT, colourScale);

Конечно, привязка GL_TEXTURE_1D и затем использование GL_TEXTURE_2DЭто не так, как это должно быть сделано, однако я не понимаю, почему это работает?И мне было бы очень интересно заставить его работать с 2D-текстурой.

Так, кто находит ошибку в моем коде?

...