Как нарисовать мороженое с OpenGL - PullRequest
0 голосов
/ 27 ноября 2018

Как вопрос, как нарисовать 3d мороженое?Я должен нарисовать конус и мяч.Но мяч не может поместиться внутри конуса ..... Я стараюсь изо всех сил, но шар либо заостряется за конусом, либо целиком сообщает конусу ... Кто-нибудь может меня извинить за это.Я следовал записке лектора, но все еще не смог получить.

#include <Windows.h>
#include <gl/GL.h>
#include <math.h>
#include <time.h>
#include <gl/GLU.h>
#pragma comment (lib, "OpenGL32.lib")
#pragma comment (lib, "GLU32.lib")

#define WINDOW_TITLE "OpenGL Window"

LRESULT WINAPI WindowProcedure(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        break;
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}
//--------------------------------------------------------------------

bool initPixelFormat(HDC hdc)
{
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));

    pfd.cAlphaBits = 8;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 24;
    pfd.cStencilBits = 0;

    pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;

    pfd.iLayerType = PFD_MAIN_PLANE;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;

    // choose pixel format returns the number most similar pixel format available
    int n = ChoosePixelFormat(hdc, &pfd);

    // set pixel format returns whether it sucessfully set the pixel format
    if (SetPixelFormat(hdc, n, &pfd))
    {
        return true;
    }
    else
    {
        return false;
    }
}
//--------------------------------------------------------------------

void display()
{
    glPushMatrix();
    glRotatef(120, 1.0, 0, 0);

    GLUquadricObj  * cylinder = NULL;
    cylinder = gluNewQuadric();
    glColor3f(1, 0, 0);
    gluQuadricDrawStyle(cylinder, GLU_FILL);
    gluCylinder(cylinder, 0.52, 0.0, 2.0, 30, 20);
    gluDeleteQuadric(cylinder);

    GLUquadricObj  * sphere = NULL;
    sphere = gluNewQuadric();
    glColor3f(1, 1, 1);
    gluQuadricDrawStyle(sphere, GLU_LINE);
    gluSphere(sphere, 0.5, 20, 20);
    gluDeleteQuadric(sphere);

    glPopMatrix();
}
//--------------------------------------------------------------------

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
{
    WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpfnWndProc = WindowProcedure;
    wc.lpszClassName = WINDOW_TITLE;
    wc.style = CS_HREDRAW | CS_VREDRAW;

    if (!RegisterClassEx(&wc)) return false;

    HWND hWnd = CreateWindow(WINDOW_TITLE, WINDOW_TITLE, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 640,
        NULL, NULL, wc.hInstance, NULL);

    //--------------------------------
    //  Initialize window for OpenGL
    //--------------------------------

    HDC hdc = GetDC(hWnd);

    //  initialize pixel format for the window
    initPixelFormat(hdc);

    //  get an openGL context
    HGLRC hglrc = wglCreateContext(hdc);

    //  make context current
    if (!wglMakeCurrent(hdc, hglrc)) return false;

    //--------------------------------
    //  End initialization
    //--------------------------------

    ShowWindow(hWnd, nCmdShow);

    MSG msg;
    ZeroMemory(&msg, sizeof(msg));
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2.0f, +3.0f, -2.0f, +2.0f, -10.0f, +10.0f);

    while (true)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        display();

        SwapBuffers(hdc);
    }

    UnregisterClass(WINDOW_TITLE, wc.hInstance);

    return true;
}
//--------------------------------------------------------------------

1 Ответ

0 голосов
/ 27 ноября 2018

Обратите внимание, что рисование последовательностями glBegin / glEnd, стек матрицы конвейеров с фиксированными функциями и конвейер с фиксированными функциями для каждой модели освещения вершин не рекомендуется с десятилетий.Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер для современного способа рендеринга.


в любом случае,В PIXELFORMATDESCRIPTOR правильно указан буфер глубины:

 pfd.cDepthBits = 24;

теперь вам нужно использовать буфер глубины.

Примечание: номер цветабиты буфера должны быть 24 вместо 32 см. документацию cColorBits:

Указывает количество цветовых битовых плоскостей в каждом цветовом буфере. Для типов пикселей RGBA это размер цветового буфера, исключая альфа-битовые плоскости .Для пикселей с цветовым индексом это размер буфера с цветовым индексом.


Для использования буфера глубины Проверка глубины должна быть включена с помощью glEnable.
Далее необходимо очистить буфер цвета и буфер глубины кадрового буфера по умолчанию в начале каждого кадра на glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )

void display()
{
    glEnable( GL_DEPTH_TEST );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glPushMatrix();
    glRotatef(120, 1.0, 0, 0);

    GLUquadricObj  * cylinder = NULL;
    cylinder = gluNewQuadric();
    glColor3f(1, 0.5, 0);
    gluQuadricDrawStyle(cylinder, GLU_FILL);
    gluCylinder(cylinder, 0.52, 0.0, 2.0, 30, 20);
    gluDeleteQuadric(cylinder);

    GLUquadricObj  * sphere = NULL;
    sphere = gluNewQuadric();
    glColor3f(1, 1, 0.5);
    gluQuadricDrawStyle(sphere, GLU_FILL);
    gluSphere(sphere, 0.5, 20, 20);
    gluDeleteQuadric(sphere);

    glPopMatrix();
}

Смотрите превью, где я изменил gluQuadricDrawStyle для сферы с GLU_LINE на GL_FILL:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...