2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Вывести сетку из красных точек на OpenGL
Сообщение26.12.2020, 17:47 
Уважаемые участники, хочу вывести "решетку" из красных точек 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 байт". Что ему не нравится?

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#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][0] = i;  //координата X

                    A[i][j][1] = j;  //координата Y

                    A[i][j][2] = 1;  //красный цвет

                }


            }



            // Первоначальное заполнение "Массива вершин" координатами первого и второго слоя из массива А. Перескакиваем через два столбца.

            for (i = 0; i < 10; i++)
            {

                for (j = 0; j < 10; j = j + 2)
                {
                    vertices[i] = A[i][j][0];

                    vertices[i + 1] = A[i][j][1];


                }


            }



            // Заполнение "Массива цветов" координатами третьего, четвертого и пятого слоя из массива А. Красный цвет - третий. Синий и зеленый оставляем нули.

            for (i = 0; i < 10; i++)
            {

                for (j = 0; j < 10; j = j + 3)
                {
                    colors[i] = A[i][j][2];

                    colors[i + 1] = A[i][j][3];

                    colors[i + 2] = A[i][j][4];

                }


            }


            Z = 1;
           
    }

    else
    {    

            // Работа с массивом цветов (с координатами третьего слоя массива А). Перескакиваем через три столбца.

            for (i = 0; i < 10; i++)
            {

                for (j = 0; j < 10; j = j + 3)
                {
                    colors[i] = A[i][j][2];

                    colors[i + 1] = A[i][j][3];

                    colors[i + 2] = A[i][j][4];

                }


            }

    }


    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;

}

 
 
 
 Posted automatically
Сообщение26.12.2020, 18:44 
 i  Тема перемещена из форума «Программирование» в форум «Карантин»
по следующим причинам:

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

 
 
 
 Posted automatically
Сообщение26.12.2020, 22:04 
 i  Тема перемещена из форума «Карантин» в форум «Программирование»

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group