Я ищу одномерную текстуру, содержащую значения 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-текстурой.
Так, кто находит ошибку в моем коде?