Хранить массив поплавков в текстуре и получать доступ к поплавкам из шейдера, используя координаты текстуры - PullRequest
0 голосов
/ 15 февраля 2019

Редактировать: убрал много беспорядка и перефразировал вопрос.

Я сохранил массив с плавающей точкой в ​​моем шейдере, используя:

float simpleArray2D[4] = { 10.0f, 20.0f, 30.0f, 400.0f };
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 2, 2, 0, GL_RGB, GL_FLOAT, &simpleArray2D);

Как получить доступ к определенным элементам из массива с плавающей точкой в ​​шейдере?

Определенный фрагментный шейдеркод, показывающий, что я сделал, чтобы проверить это до сих пор, отображающий зеленый цвет, когда значение является указанным (10.0f в данном случае), и красный, если это не так.

vec2 textureCoordinates = vec2(0.0f, 0.0f);
float testValueFloat = float(texture(floatArraySampler, textureCoordinates));
outColor = testValueFloat >= 10.0f ? vec4(0,1,0,1) : vec4(1,0,0,1); //Showed green
//outColor = testValueFloat >= 10.1f ? vec4(0,1,0,1) : vec4(1,0,0,1); //Showed red

1 Ответ

0 голосов
/ 15 февраля 2019

В GLSL вы можете использовать texelFetch, чтобы получить тексель из текстуры по интегральным координатам.
Это означает, что тексели текстуры могут быть адресованы аналогично элементам массива, с помощьюindex:

ivec2 ij = ivec2(0, 0);
float testValueFloat = texelFetch(floatArraySampler, ij, 0).r;

Но обратите внимание, массив состоит из 4 элементов.

float simpleArray2D[4] = { 10.0f, 20.0f, 30.0f, 400.0f };

Таким образом, текстура может быть текстурой 2x2 с одним цветомканал (GL_RED)

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, 2, 2, 0, GL_RED, GL_FLOAT, &simpleArray2D);

или текстура 1x1 с 4 цветными каналами (GL_RGBA)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1, 1, 0, GL_RGBA, GL_FLOAT, &simpleArray2D);

, но это не может быть текстура RGBA 2x2, потому что дляэтот массив должен иметь 16 элементов.

...