Вывести сетку из красных точек на OpenGL
Уважаемые участники, хочу вывести "решетку" из красных точек 10x10 в OpenGL. Пишу на C++ в Visual Studio 2019.
В качестве "хранителя данных" использую трехмерный массив A с пятью слоями.
Первый слой - координаты точек X, просто индексы. Второй слой - координаты Y, тоже индексы. Третий, четвертый и пятый - цвета R, G и B. Заполняю единицами только красный, синий и зеленый - нули.
В функции void display сделал условие. Если запуск функции первый (IF Z = 0, и тут же меняем на Z = 1) , то заполняем массивы vertex и colors из трехмерного массива (из первого слоя берем X, из второго Y, из третьего красный цвет).
Выводим решетку на экран.
Когда первоначальная инициализация прошла (Z = 1), в условии ELSE заполняем красный цвет из массива A еще раз. Просто так, потом буду менять цвет в точках.
Вместо решетки почему-то выводятся четыре разноцветных точки.
На 95 строке пишет предупреждение "C6385: Чтение недопустимых данных из A[i][j]. Доступный для чтения объем равен 20 байт, однако считать можно только 24 байт". Что ему не нравится?
#include <iostream>
#include <cstdlib>
#include <glut.h>
#include <windows.h>
using namespace std;
unsigned int i, j, k, w;
float x, y, c;
int Z;
float vertices[200] = { 0 }; // { 0,0 , 0,0 , 0,0 , 0,0 }
float colors[300] = { 0 }; // { 0,0,0 , 0,0,0 , 0,0,0 , 0,0,0 }
float A[10][10][5] = { 0 };
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
if (Z == 0)
{
/* Инициализация рабочего массива A, массивов vertex и colors и их первый вывод ------------------
Массив A : первый слой - координата x
второй слой - координата y
третий слой - цвет R
четвертый слой - цвет G
пятый слой - цвет B
*/
// Первоначальное заполнение координатами первого и второго слоя "Рабочего массива A" индексами. Третий слой заполняем единицами (красный).
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
A[i][j][1] = i; //координата X
A[i][j][2] = j; //координата Y
A[i][j][3] = 1; //красный цвет
}
}
// Первоначальное заполнение "Массива вершин" координатами первого и второго слоя из массива А. Перескакиваем через два столбца.
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j = j + 2)
{
vertices[i] = A[i][j][1];
vertices[i + 1] = A[i][j][2];
}
}
// Заполнение "Массива цветов" координатами третьего, четвертого и пятого слоя из массива А. Красный цвет - третий. Синий и зеленый оставляем нули.
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j = j + 3)
{
colors[i] = A[i][j][3];
colors[i + 1] = A[i][j][4];
colors[i + 2] = A[i][j][5];
}
}
Z = 1;
}
else
{
// Работа с массивом цветов (с координатами третьего слоя массива А). Перескакиваем через три столбца.
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j = j + 3)
{
colors[i] = A[i][j][3];
colors[i + 1] = A[i][j][4];
colors[i + 2] = A[i][j][5];
}
}
}
glVertexPointer(2, GL_FLOAT, 0, &vertices);
glColorPointer(3, GL_FLOAT, 0, &colors);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_POINTS, 0, 200);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glutSwapBuffers();
}
// Настройки таймера ***********************************************************
void TimerFunction(int value)
{
glutPostRedisplay(); //перерисовываем экран
glutTimerFunc(1000, TimerFunction, 1); //запускаем таймер заново
}
//******************************************************************************
// Настройки OpenGL -------------------------------------------
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(50, 50);
glutInitWindowSize(800, 600);
glutCreateWindow("Massiv 10 10 Red");
glLoadIdentity();
glOrtho(0, 60, 0, 60, 0, 1);
glClearColor(1.0, 1.0, 1.0, 1.0);
glPointSize(8);
glutDisplayFunc(display);
glutTimerFunc(1000, TimerFunction, 1);
Z = 0;
glutMainLoop();
return 0;
}
