2017-03-10 17 views
-2

最近、私はOpenGLでコンピュータグラフィックスを研究していますが、私はOpenGL、DirecXなどを使わないで完全に何かを描くことができるかどうかという疑問があります つまり、私自身で三角形を描きますか?頂点を指定するだけでなく、適切な関数を実行します。コンピュータグラフィックス:私自身で三角形を描く

+0

なぜdownvotesですか?これは完全に合理的な質問です。 – Beginner

+2

@Beginner私はこの質問に良い答えを与えるのは少し難しいと思います。答えはちょうど "はい、できます - cf. OpenGLの実装"です。これは技術的には正解ですが、OPにはあまり役に立ちません。あるいは、 "はい、できます"となるでしょう。コンピュータグラフィックスについてこの質問を理解する方法は、「ウィンドウ内のピクセルの色付け方法」ではなく「OpenGLを使用せずに3Dシーンをレンダリングする方法」です。前者がOPの意味だったのであれば、私の意見で言い換えればならないはずです。 – kaufmanu

+0

多分私は良い質問をしませんでした。実際、三角形を描く関数を呼び出したときに何が起こったのか不思議です。 – Ico826

答えて

-1

もちろん可能です。お使いのOSのウィンドウマネージャーにウィンドウのピクセルにアクセスし、ウィンドウペインのピクセルを直接色付けするように依頼することができます。

ここウィンドウXRESxYRESに25000(NPTS)ランダム黒画素を描画some C codeだ、 'GCC -lX11 -o X1 x1.c' でコンパイル、 './x1 &'

//----- x1.c simple xwindows example ----- 

#include <X11/Xlib.h> // must precede most other headers! 
#include <stdlib.h> 
#include <time.h> 
#include <sys/time.h> 

void update_screen(); 

int XRES=500; 
int YRES=500; 
int NPTS=25000; 

//Need this array if we're plotting all at once using XDrawPoints 
//XPoint pts[NPTS]; 

Display *dsp; 
Window win; 
GC gc; 

int main(){ 

    dsp = XOpenDisplay(NULL); 
    if(!dsp){ return 1; } 

    int screen = DefaultScreen(dsp); 
    unsigned int white = WhitePixel(dsp,screen); 
    unsigned int black = BlackPixel(dsp,screen); 

    win = XCreateSimpleWindow(dsp, 
          DefaultRootWindow(dsp), 
          0, 0, // origin 
          XRES, YRES, // size 
          0, black, // border width/clr 
          white); // backgrd clr 


    Atom wmDelete=XInternAtom(dsp, "WM_DELETE_WINDOW", True); 
    XSetWMProtocols(dsp, win, &wmDelete, 1); 

    gc = XCreateGC(dsp, win, 
       0,  // mask of values 
       NULL); // array of values 

    XSetForeground(dsp, gc, black); 

    XEvent evt; 
    long eventMask = StructureNotifyMask; 
    eventMask |= ButtonPressMask|ButtonReleaseMask|KeyPressMask|KeyReleaseMask; 
    XSelectInput(dsp, win, eventMask); 

    KeyCode keyQ; 
    keyQ = XKeysymToKeycode(dsp, XStringToKeysym("Q")); 

    XMapWindow(dsp, win); 

    // wait until window appears 
    do { XNextEvent(dsp,&evt); } while (evt.type != MapNotify); 

    srand(time(0)); // only 1 sec resolution so use once per run 
    update_screen(); 

    int loop = 1; 

    while (loop) { 
    // for repeated fine seeding use: 
    // struct timeval ti 
    // gettimeofday(&ti,NULL); 
    // srand((ti.tv_sec * 1000) + (ti.tv_usec/1000)); 

    XNextEvent(dsp, &evt); 

    switch (evt.type) { 

     case (ButtonRelease) : 

     update_screen(); 
     break; 

     case (KeyRelease) : 

     if (evt.xkey.keycode == keyQ) loop = 0; 
     else update_screen(); 
     break; 

     case (ConfigureNotify) : 

     // Check if window has been resized 
     if (evt.xconfigure.width != XRES || evt.xconfigure.height != YRES) 
     { 
      XRES = evt.xconfigure.width; 
      YRES = evt.xconfigure.height; 
      update_screen(); 
     } 
     break; 

     case (ClientMessage) : 

     if (evt.xclient.data.l[0] == wmDelete) loop = 0; 
     break; 

     default : 

     break; 
    } 
    } 

    XDestroyWindow(dsp, win); 
    XCloseDisplay(dsp); 

    return 0; 
} 

void update_screen() 
{ 
    XClearWindow(dsp, win); 

    XDrawLine(dsp, win, gc, 0, YRES/2, XRES-1, YRES/2); //from-to 
    XDrawLine(dsp, win, gc, XRES/2, 0, XRES/2, YRES-1); //from-to 

    long i; 
    for (i=0; i<NPTS; i++) { 
    XDrawPoint(dsp, win, gc, rand()%XRES, rand()%YRES); 
    //pts[i].x = rand()%XRES; 
    //pts[i].y = rand()%YRES; 
    } 

    //XClearWindow(dsp,win); 
    //XDrawPoints(dsp, win, gc, pts, NPTS, CoordModeOrigin); 

    return; 
} 
+0

私はこれがまだOPの質問の点で "自分のもの"とは認められないと思います。 – datenwolf

+0

@datenwolfあなたはポイントを持っています。ここに階層があります。 – Beginner

0

技術的には、はい、外部ライブラリを必要とせずに、すべて自分で三角形を描くことができます。もちろん、これを行うには、レンダリングパイプライン全体を複製する必要があります。正しい結果を生み出し、効率的で汎用性の高いレンダラを書くことは、簡単な作業ではありません。それでも、これは教育目的のためには貴重なことかもしれませんが、私はまだ試しに時間と時間を置くのではなく、OpenGL(またはあなたの仕事にふさわしい他のライブラリ/フレームワーク)の使い方を学ぶことをお勧めしますなぜあなたの自作レンダラがこの小さなアーティファクトを作り出すのかを知ることができます。

-1

Inで実行最後に、三角形を描くことは、多くのピクセルでの色付けを意味します。現在のスクリーンでは、それは100万画素であるかもしれません。

しかし、標準的なC++の演習では、文字で三角形を描くことができます。

 * 
    *** 
    ***** 
    ******* 

確かに、あなたのコンソールの解像度はかなり限られているかもしれませんが、基本的なアルゴリズムはほぼ同じです。行って、上の簡単な例から始めましょう。次に、あなた自身でもっと難しくするために、ユーザーに3点x,yを入力させ、それらをコーナーポイントとして使用させます。テキストなので、小さな値のxyでテストしますが、それはちょっとしたことです。

+0

*文字で三角形を描くことは、特に頂点座標のみが与えられている場合には、完全に有効な演習です。 downvotingの前に:(x_1、y_1、z_1)、...、(x_3、y_3、z_3) 'を与えれば、これを効率的にどのように行うのですか?ある日、誰かがここで周りの狂気を説明しなければならない。 – Beginner

関連する問題