Мне нужно нарисовать прямоугольник в OpenGL ES 2.0, но организовать цвет для прямоугольника во фрагментном шейдере. Я нарисую два треугольника, чтобы представить прямоугольник. Это похоже на отображение текстуры, но без координат текстуры. Что было бы идеально, это взять определенный пиксель и рассчитать его положение. С другой стороны есть массив, содержащий 16 элементы 0с и 1s. Пиксель вычисляется и сравнивается с элементом массива в том же месте (это возможно, если вы берете остаток от деления с 16 так как он вернется 0 — 15). Если элемент в соответствующем индексе массива 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).
Задача ещё не решена.