L-SYSTEM

์ •ํ•ด์ง„ ๊ทœ์น™์— ์˜ํ•ด ํŠน์ • ๋ฌธ์ž์—ด์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ „๊ฐœํ•œ ํ›„ ์ „๊ฐœ๋œ ๋ฌธ์ž์—ด์— ์˜๊ฑฐํ•˜์—ฌ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์„ L-์‹œ์Šคํ…œ์ด๋ผ ํ•œ๋‹ค. 1986๋…„ ๋ฆฐ๋ด๋งˆ์ด์–ด(Lindenmayer)๊ฐ€ ์ƒํƒœ๊ณ„์˜ ์„ฑ์žฅ ๋ชจํ˜•, ํŠนํžˆ ๋‚˜๋ฌด์˜ ๋ถ„๊ธฐ ๋ชจํ˜•์„ ์—ฐ๊ตฌํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ๊ณ ์•ˆํ•˜์˜€๋‹ค.

L-SYSTEM ๊ฐœ์š”

F, +, -

L-์‹œ์Šคํ…œ์—์„œ๋Š” ๊ฑฐ๋ถ์ด ๊ทธ๋ž˜ํ”ฝ๊ณผ ๋ฌธ์ž์—ด์— ์˜๊ฑฐํ•˜์—ฌ ํ”„๋ž™ํƒˆ์„ ๊ทธ๋ฆฌ๋Š”๋ฐ, ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž ์ค‘ ๋‹ค์Œ์˜ ๋ฌธ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ฑฐ๋ถ์ด ๊ทธ๋ž˜ํ”ฝ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ ์„ ๊ทธ๋ฆฌ๊ณ  ํšŒ์ „์„ ํ•œ๋‹ค.

  • F : ์ผ์ •ํ•œ ๊ธธ์ด์˜ ์„ ์„ ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ์˜ ์ ์„ ์„ ์˜ ๋์ ์œผ๋กœ ์ด๋™

    • : ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ angle ๋งŒํผ ํšŒ์ „

    • : ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ angle ๋งŒํผ ํšŒ์ „

๋ณ€ํ™˜๊ทœ์น™

์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”ํ˜ธ ๊ณก์„ ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž.

  1. ์„ ์„ ๊ทธ๋ฆฐ๋‹ค ( F )

  2. 60 ๋„ ์ขŒํšŒ์ „ํ•œ๋‹ค ( + )

  3. ์„ ์„ ๊ทธ๋ฆฐ๋‹ค ( F )

  4. 60 ๋„ ์šฐํšŒ์ „ํ•œ๋‹ค ( - )

  5. 60 ๋„ ์šฐํšŒ์ „ํ•œ๋‹ค ( - )

  6. ์„ ์„ ๊ทธ๋ฆฐ๋‹ค ( F )

  7. 60 ๋„ ์ขŒํšŒ์ „ํ•œ๋‹ค ( + )

  8. ์„ ์„ ๊ทธ๋ฆฐ๋‹ค ( F )

์ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1์ฐจ ๋ณ€ํ™˜ : F+F--F+F

์œ„๋Š” 1 ์ฐจ์›์˜ ์ฝ”ํ˜ธ ๊ณก์„ ์„ ๊ทธ๋ฆฐ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์˜ 2 ์ฐจ์›์˜ ์ฝ”ํ˜ธ ๊ณก์„ ์€ ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆด๊นŒ? 1 ์ฐจ ์ฝ”ํ˜ธ ๊ณก์„ ์„ ๊ทธ๋ฆฌ๋Š” ๊ทœ์น™์„ A๋ผ ํ•œ๋‹ค๋ฉด A ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค. A( F+F--F+F)

  1. A ๋ฅผ ๊ทธ๋ฆฐ๋‹ค

  2. 60 ๋„ ์ขŒํšŒ์ „ํ•œ๋‹ค ( + )

  3. A ๋ฅผ ๊ทธ๋ฆฐ๋‹ค

  4. 60 ๋„ ์šฐํšŒ์ „ํ•œ๋‹ค ( - )

  5. 60 ๋„ ์šฐํšŒ์ „ํ•œ๋‹ค ( - )

  6. A ๋ฅผ ๊ทธ๋ฆฐ๋‹ค

  7. 60 ๋„ ์ขŒํšŒ์ „ํ•œ๋‹ค ( + )

  8. A ๋ฅผ ๊ทธ๋ฆฐ๋‹ค.

์ด์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

A+A--A+A

์œ„์˜ ๊ทœ์น™์„ A -> F + F - - F + F ๋กœ ๊ณ ์ณ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

2์ฐจ ๋ณ€ํ™˜ : F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F

์ด๋ฅผ 3์ฐจ ๋ณ€ํ™˜ ํ•ด ๋ณธ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

3์ฐจ ๋ณ€ํ™˜ : F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F

์ด์™€ ๊ฐ™์ด F -> F+F--F+F ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™์„ ๋ณ€ํ™˜๊ทœ์น™์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด ๋ณ€ํ™˜ ๊ทœ์น™์„ 3๋ฒˆ ๋ณ€ํ™˜ํ•˜๋ฉด ์œ„์˜ 3์ฐจ ๋ณ€ํ™˜์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

๊ณต๋ฆฌ

์ˆ˜ํ•™์—์„œ ๊ณต๋ฆฌ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์„ ์ด๋ฃฌ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด '์‚ผ๊ฐํ˜• ๋‚ด๊ฐ์˜ ํ•ฉ์€ 180๋„์ด๋‹ค' ๊ฐ€ ๊ณต๋ฆฌ์˜ ์˜ˆ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ณต๋ฆฌ์—์„œ ๋งŽ์€ ์ˆ˜ํ•™์  ์ •๋ฆฌ๋“ค์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ์ฆ‰ ๊ณต๋ฆฌ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์›์น™์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณต๋ฆฌ๋Š” ๋งˆ์น˜ ์œ ์ „์ž์™€๋„ ๊ฐ™๋‹ค. ๊ฐ„๋‹จํ•œ ์œ ์ „์ž๊ฐ€ ์ƒ๋ฌผ์ฒด์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ณต์žกํ•œ ์„ฑ์žฅ์„ ์ œ์–ดํ•œ๋‹ค. L-์‹œ์Šคํ…œ์—์„œ๋„ ๊ณต๋ฆฌ๋Š” ์ด์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์„ ๊ฐ–๋Š”๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ž๋ฉด L-์‹œ์Šคํ…œ์—์„œ ๊ณต๋ฆฌ๋Š” ๋ณต์žกํ•œ ํ”„๋ž™ํƒˆ์•ˆ์— ์ˆจ์–ด ์žˆ๋Š” ์œ ์ „์ž๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

L-SYSTEM ๊ตฌํ˜„

์ง€๊ธˆ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•ด๋ณผ L-์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๊ฐ–๋Š”๋‹ค.

  • F : ์ „์ง„

  • + : ์ขŒํšŒ์ „

  • - : ์šฐํšŒ์ „

  • @ : ์ ์„ ๊ทธ๋ฆฐ๋‹ค.(์—ด๋งค๋ฅผ ๊ทธ๋ฆฐ๋‹ค)

  • [ : ํ˜„์žฌ ์œ„์น˜์™€ ๊ฐ๋„๋ฅผ ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค.

  • ] : ํ˜„์žฌ ์œ„์น˜์™€ ๊ฐ๋„๋ฅผ ์Šคํƒ์˜ ์ตœ์ƒ์œ„ ์•„์ดํ…œ์˜ ์œ„์น˜์™€ ๊ฐ๋„๋กœ ์„ค์ •ํ•œ๋‹ค.

  • { : ํ˜„์žฌ ์œ„์น˜๋งŒ์„ ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค.

  • } : ํ˜„์žฌ ์œ„์น˜๋ฅผ ์Šคํƒ์˜ ์ตœ์ƒ์œ„ ์•„์ดํ…œ์˜ ์œ„์น˜์™€ ๊ฐ๋„๋กœ ์„ค์ •ํ•œ๋‹ค.

  • | : ์™ผ์ชฝ์œผ๋กœ 180 ๋„ ํšŒ์ „ํ•œ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ ๊ฑฐ๋ถ์ด ๊ทธ๋ž˜ํ”ฝ ํด๋ž˜์Šค๊ฐ€ ์•ฝ๊ฐ„ ๋ณ€ํ˜•๋˜์—ˆ๋‹ค. ์Šคํƒ์— ์ €์žฅํ•˜๋Š” ๋‚ด์šฉ๊ณผ Push() ํ•จ์ˆ˜์— ์ƒˆ๋กœ์šด ์ธ์ž๊ฐ€ ์„ค์ •๋œ ๊ฒƒ์ด๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๊ฐˆ ๊ฒƒ์ด๋‹ค.

struct StackItem
{
    Point3D cp;
    float angle;
    bool save_angle;
    StackItem() { cp.x=cp.y=cp.z=0.0f; angle=0.0f; save_angle=false; }
    StackItem(const Point3D& pt, float a, bool s)
    {
        cp.x = pt.x;
        cp.y = pt.y;
        cp.z = pt.z;
        angle = a;
        save_angle = s;
    }
    StackItem(const StackItem& i)
    {
        cp = i.cp;
        angle = i.angle;
        save_angle = i.save_angle;
    }
};

typedef stack<StackItem> pstack;

class Turtle
{
    ... 
    void Push(bool save_angle=true);
    void Pop(void);
    ... 
};
void Turtle::Push(bool save_angle)
{
    int index = PointList.size()-1;
    Point3D pt(PointList[index].x, PointList[index].y, PointList[index].z);
    //ํฌ์ธํŠธ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ์ ์„ push ํ•œ๋‹ค.
     // save_angle ์ด true ์ด๋ฉด pop ์ˆ˜ํ–‰์‹œ ์ €์žฅ๋œ ๊ฐ๋„๊ฐ€ ํ˜„์žฌ ๊ฐ๋„๊ฐ€ ๋œ๋‹ค.
    StackItem s(pt, angle, save_angle);
    PointStack.push(s);
}

void Turtle::Pop(void)
{
    if(PointStack.size())
    {
        StackItem s(PointStack.top());
        PointStack.pop();
        PointList.push_back(s.cp);
        if(s.save_angle)
        {
            angle = s.angle;
        }
    }
}

์ด์ œ L ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ด ๋ณด์ž. ์•„๋ž˜๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋กœ ์„ค๋ช…์€ ํ•˜์ง€ ์•Š๊ณ  ์ฃผ์„์„ ๋‹ฌ์•˜๋‹ค.

/*******************************************************************************
{ LSystem Class
{ written by Sungcheol Kim
{ 2003.4.27
{
{ F : ์ „์ง„
{ + : ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „
{ - : ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํšŒ์ „
{ | : ์™ผ์ชฝ์œผ๋กœ 180 ๋„ ํšŒ์ „
{ [ : ํ˜„์žฌ์ขŒํ‘œ, ํ˜„์žฌ ๊ฐ๋„๋ฅผ ์Šคํƒ์—์ €์žฅ
{ ] : ํ˜„์žฌ์ขŒํ‘œ, ํ˜„์žฌ ๊ฐ๋„๋ฅผ ์ €์žฅํ–ˆ๋˜ ์ขŒํ‘œ,๊ฐ๋„๋กœ ์„ค์ •
{ { : ํ˜„์žฌ์ขŒํ‘œ๋งŒ ์ €์žฅ
{ } : ํ˜„์žฌ์ขŒํ‘œ๋งŒ ์ €์žฅํ–ˆ๋˜ ์ขŒํ‘œ๋กœ ์„ค์ •
{ @ : ์—ด๋งค๋ฅผ ๊ทธ๋ฆฐ๋‹ค.
*******************************************************************************/

#ifndef _LSYSTEM_H_
#define _LSYSTEM_H_

#pragma warning(disable : 4786)

#include <map>
#include <string>
#include "turtle.h"

using namespace std;

typedef map< char, string > trule_list;
typedef map< char, string >::iterator ai;

class LSystem
{
public:
    string TotalAxiom; //์ตœ์ข… ๊ณต๋ฆฌ
    trule_list TRuleList; //๋ณ€ํ™˜๊ทœ์น™ ๋ฆฌ์ŠคํŠธ
    float angle; //ํšŒ์ „๊ฐ๋„
    float length; //์ง„ํ–‰๊ธธ์ด
    float factor; //๊ธธ์ด์˜ ๋ฐฐ์œจ
    Turtle *turtle; //๊ฑฐ๋ถ์ด
public:
    LSystem();

    void SetAngle(float rotate_angle); //ํšŒ์ „ ๊ฐ๋„๋ฅผ ์„ค์ •ํ•œ๋‹ค.
    void SetLength(float move_distance); //์ „์ง„ ๊ฑฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
    void SetFactor(float magnification); //์ „์ง„ ๋น„์œจ์„ ์„ค์ •ํ•œ๋‹ค. ์ตœ์ข… ์ „์ง„ ๊ฑฐ๋ฆฌ๋Š” length*factor ์™€ ๊ฐ™๋‹ค.

    void SelectTurtle(Turtle *pturtle); //๊ฑฐ๋ถ์ด๋ฅผ ์„ ํƒํ•œ๋‹ค.
    void AddTransRule(char name, string rule); //๋ณ€ํ™˜ ๊ทœ์น™์„ ์ƒ์„ฑ, ์ถ”๊ฐ€ํ•œ๋‹ค.
    void MakeAxiom(string axiom, int n); //๊ณต๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค. n ์ฐจ๊นŒ์ง€ ๊ณต๋ฆฌ ๋ณ€ํ™˜
    void Draw(void); //๊ณต๋ฆฌ์— ์˜ํ•œ L-์‹œ์Šคํ…œ์„ ๊ทธ๋ฆฐ๋‹ค.
};

#endif
#include "LSystem.h"

LSystem::LSystem(void)
{
    angle = 0.0f;
    length = 1.0f;
    factor = 1.0f;
    turtle = NULL;
    TotalAxiom = "";
    TRuleList.clear();
}
void LSystem::SetAngle(float rotate_angle)
{
    angle = rotate_angle;
}
void LSystem::SetLength(float move_distance)
{
    length = move_distance;
}
void LSystem::SetFactor(float magnification)
{
    factor = magnification;
}
void LSystem::SelectTurtle(Turtle *pturtle)
{
    turtle = pturtle;
}
void LSystem::AddTransRule(char name, string rule)
{
    TRuleList[name] = rule;
}
void LSystem::MakeAxiom(string axiom, int n)
{
    ai fi;
    string buffer;
    TotalAxiom = axiom;
    for(int x=0; x<n; ++x) //n์ฐจ๊นŒ์ง€ ๋ณ€ํ™˜
    {
        buffer.erase(buffer.begin(), buffer.end());//๊ณต๋ฆฌ๋ฅผ ๋‹ด์„ ๋ฒ„ํผ
        for(int i=0; i<TotalAxiom.length(); ++i)
        {
            switch(TotalAxiom[i])
            {
                case 'F':
                    fi = TRuleList.find('F'); // F ์— ๋Œ€ํ•ด์„œ ์ •์˜๋œ ๋ณ€ํ™˜ ๊ทœ์น™์ด ์žˆ์œผ๋ฉด ๊ทธ ๊ทœ์น™์„ ๋ฒ„ํผ์— ๋„ฃ๊ณ  ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ F(์ „์ง„) ์ž๋ฅผ ๋„ฃ๋Š”๋‹ค.
                    if(fi!=TRuleList.end())
                    {
                        buffer += fi->second;
                    }
                    else
                    {
                        buffer += "F";
                    }
                    break;
                case '@':
                    buffer += "@";
                    break;
                case '+':
                    buffer += "+";
                    break;
                case '-':
                    buffer += "-";
                    break;
                case '[':
                    buffer += "[";
                    break;
                case ']':
                    buffer += "]";
                    break;
                case '{':
                    buffer += "{";
                    break;
                case '}':
                    buffer += "}";
                    break;
                case '|':
                    buffer += "|";
                    break;
                default: //์œ„์˜ ๋ฌธ์ž ์ด์™ธ์˜ ๋ฌธ์ž๋Š” ํ•ด๋‹น ๋ฌธ์ž์— ํ•ด๋‹นํ•˜๋Š” ๋ณ€ํ™˜๊ทœ์น™์ด ์žˆ์œผ๋ฉด ๋ฒ„ํผ์— ๋„ฃ๋Š”๋‹ค.
                    fi = TRuleList.find((char)(TotalAxiom[i]));
                    if(fi!=TRuleList.end())
                    {
                        buffer += fi->second;
                    }
                    break;
            }
        }
        TotalAxiom = buffer; //๋ฒ„ํผ๋ฅผ ์ตœ์ข… ๊ณต๋ฆฌ์— ๋„ฃ๋Š”๋‹ค.
    }
}

void LSystem::Draw(void)
{
    for(string::iterator i = TotalAxiom.begin(); i!=TotalAxiom.end(); ++i)
    {
        switch((char)(*i))
        {
            case 'F':
                turtle->Forward(length*factor); //์ „์ง„
                break;
            case '@':
                turtle->MarkCurrentPoint(); //์—ด๋งค๊ทธ๋ฆฌ๊ธฐ 
                break;
            case '+':
                turtle->Left(angle); //์ขŒํšŒ์ „ 
                break;
            case '-':
                turtle->Right(angle); //์šฐํšŒ์ „ 
                break;
            case '|':
                turtle->Left(180); //์ขŒ๋กœ 180 ๋„ ํšŒ์ „
                break;
            case '[':
                turtle->Push(true); //์œ„์น˜, ๊ฐ๋„ ์ €์žฅ
                break;
            case ']':
            case '}':
                turtle->Pop(); //์œ„์น˜ ๋˜๋А ๊ฐ๋„ ํ™”์›
                break;
            case '{':
                turtle->Push(false); //์œ„์น˜ ์ €์žฅ
                break;
        }
    }
}

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” L-์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ จ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

#include "lib\egl.h"
#include "LSystem.h"

using namespace egl;

class RenderWindow : public Window
{
private:
    LSystem lsystem;
    Turtle turtle;
public:
    virtual BOOL InitGL(void);
    virtual void RenderGLScene(void);
};

BOOL RenderWindow::InitGL(void)
{
    Window::InitGL();

    lsystem.SelectTurtle(&turtle); //๊ฑฐ๋ถ์ด ์„ ํƒ
    lsystem.SetAngle(60.0f); //ํšŒ์ „ ๊ฐ๋„๋ฅผ 60 ๋„๋กœ ์„ค์ •
    lsystem.SetLength(1.0f); //์ „์ง„ ๊ฑฐ๋ฆฌ๋ฅผ 1.0 ์œผ๋กœ ์„ค์ •
    lsystem.SetFactor(1.0f); //์ „์ง„ ๋น„์œจ์„ 1.0 ์œผ๋กœ ์„ค์ •
    lsystem.AddTransRule('F', "F+F--F+F"); //์ฝ”ํ ๊ณก์„ ์„ ๊ทธ๋ฆฌ๋Š” ๋ณ€ํ™˜ ๊ทœ์น™ F ์ƒ์„ฑ ๋ฐ ์ถ”๊ฐ€
    lsystem.MakeAxiom("F", 3); //๊ณต๋ฆฌ F ๋ฅผ 3 ์ฐจ์— ๊ฑธ์ณ ๋ณ€ํ™˜ 

    return TRUE;
}

void RenderWindow::RenderGLScene(void)
{
    Window::RenderGLScene();
    turtle.SetStartPoint(-13.0f, 0.0f, -30.0f); //๊ฑฐ๋ถ์ด์˜ ์‹œ์ž‘์œ„์น˜๋ฅผ ์ •ํ•˜๊ณ  
    lsystem.Draw(); //L-์‹œ์Šคํ…œ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํ”„๋ž™ํƒˆ์„ ๊ทธ๋ฆฐ๋‹ค.
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    RenderWindow app;
    if(!app.Create(FALSE, "EDin's OpenGL - Texture2D"))
        return EXIT_FAILURE;
    return app.Run();
}

์•„๋ž˜๋Š” ์‹คํ–‰ ๊ฒฐ๊ณผ์ด๋‹ค.

๋‹ค์Œ ์žฅ์—์„œ L-์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”„๋ž™ํƒˆ์„ ๊ทธ๋ ค๋ณด์ž.

Last updated

Was this helpful?