Расставьте цвет в фрагментном шейдере без координат текстуры в зависимости от положения фрагмента.

Мне нужно нарисовать прямоугольник в OpenGL ES 2.0, но организовать цвет для прямоугольника во фрагментном шейдере. Я нарисую два треугольника, чтобы представить прямоугольник. Это похоже на отображение текстуры, но без координат текстуры. Что было бы идеально, это взять определенный пиксель и рассчитать его положение. С другой стороны есть массив, содержащий 16 элементы 0с и 1s. Пиксель вычисляется и сравнивается с элементом массива в том же месте (это возможно, если вы берете остаток от деления с 16 так как он вернется 015). Если элемент в соответствующем индексе массива 1, этот пиксель будет окрашен с использованием определенного цвета из атрибута фрагмента шейдера, в противном случае он не будет окрашен.

Следующая диаграмма иллюстрирует проблему:

Картинка как модель для проблемы

Это моя проблема

Массив передается как единое значение фрагментному шейдеру, и кажется, что он передан неправильно:

Ниже приведен код, в котором равномерное значение передается фрагментному шейдеру:

void GeometryEngine::drawLineGeometry(QGLShaderProgram *program)
{

glBindBuffer(GL_ARRAY_BUFFER, vboId);

// Bind attribute position in vertex shader to the program
int vertexLocation = program->attributeLocation("position");
program->enableAttributeArray(vertexLocation);
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);

const int array[16] = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0};int arrayLocation = program->attributeLocation("array");
program->setUniformValueArray(arrayLocation, array, 16);
// Draw triangles (6 points)
glDrawArrays(GL_TRIANGLES, 0, 6);
}

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

uniform int array[16];

void main()
{

gl_FragColor = vec4(array[0], 0.0, 0.0, 1.0);

/* int index = int(mod(gl_FragCoord.x, 16.0));
if( array[index] == 1 )
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
else
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
*/
}

Комментированные строки должны создавать определенный цвет для фрагментов, но я не могу проверить эту часть, потому что массив не передан правильно. Прямоугольник черный, а не красный (массив [0] равен 1, а не 0).

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]