最近、私はOpenGLでコンピュータグラフィックスを研究していますが、私はOpenGL、DirecXなどを使わないで完全に何かを描くことができるかどうかという疑問があります つまり、私自身で三角形を描きますか?頂点を指定するだけでなく、適切な関数を実行します。コンピュータグラフィックス:私自身で三角形を描く
答えて
もちろん可能です。お使いの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;
}
技術的には、はい、外部ライブラリを必要とせずに、すべて自分で三角形を描くことができます。もちろん、これを行うには、レンダリングパイプライン全体を複製する必要があります。正しい結果を生み出し、効率的で汎用性の高いレンダラを書くことは、簡単な作業ではありません。それでも、これは教育目的のためには貴重なことかもしれませんが、私はまだ試しに時間と時間を置くのではなく、OpenGL(またはあなたの仕事にふさわしい他のライブラリ/フレームワーク)の使い方を学ぶことをお勧めしますなぜあなたの自作レンダラがこの小さなアーティファクトを作り出すのかを知ることができます。
Inで実行最後に、三角形を描くことは、多くのピクセルでの色付けを意味します。現在のスクリーンでは、それは100万画素であるかもしれません。
しかし、標準的なC++の演習では、文字で三角形を描くことができます。
*
***
*****
*******
確かに、あなたのコンソールの解像度はかなり限られているかもしれませんが、基本的なアルゴリズムはほぼ同じです。行って、上の簡単な例から始めましょう。次に、あなた自身でもっと難しくするために、ユーザーに3点x,y
を入力させ、それらをコーナーポイントとして使用させます。テキストなので、小さな値のx
とy
でテストしますが、それはちょっとしたことです。
*文字で三角形を描くことは、特に頂点座標のみが与えられている場合には、完全に有効な演習です。 downvotingの前に:(x_1、y_1、z_1)、...、(x_3、y_3、z_3) 'を与えれば、これを効率的にどのように行うのですか?ある日、誰かがここで周りの狂気を説明しなければならない。 – Beginner
- 1. 三角形を描く
- 2. ループで直角三角形を描く
- 3. アンドロイドに三角形を描く
- 4. テクスチャ付き三角形を描く
- 5. 正多角形の各辺に三角形を描く
- 6. 三角形描画メソッド
- 7. C++でアステリックの等角三角形を描く
- 8. OpenGLで三角形を描画する
- 9. Vulkanで三角形を描くことはできません
- 10. fasmを使用してアセンブリで三角形を描く
- 11. QUARTZ 2Dで三角形を描く方法は?
- 12. mathematicaで長さnの三角形グリッドを描く方法
- 13. Three.jsで基本的な三角形を描く
- 14. android xmlで三角形を描く方法
- 15. なぜQtウィジェットに三角形を描くのですか
- 16. OpenGL ESで現実世界の三角形を描く
- 17. DirectX/OpenGLの三角形描画順序
- 18. フレームあたり永続的な三角形を描く
- 19. パスカルの三角形をパスカルで描く菱形のようにプログラミングする
- 20. 2色のSpritekitで四角形/円と三角形を描画します。 。 。
- 21. OpenGL ES 2.0でglDrawElementsで三角形を描くことができません
- 22. CSS:cssの三角形を描く方法を説明してください
- 23. HTMLとCSSを使ってKundli Design(四角形の菱形と三角形)を描く方法は?
- 24. 画像から生成された三角形の三角形をつくる
- 25. シェルピンスキー三角形
- 26. ドラッグアンドドロップ三角形
- 27. 三角形アルゴリズム
- 28. パス三角形
- 29. センター三角形
- 30. OpenGLESの三角形ファンでポリゴンを描画する
なぜdownvotesですか?これは完全に合理的な質問です。 – Beginner
@Beginner私はこの質問に良い答えを与えるのは少し難しいと思います。答えはちょうど "はい、できます - cf. OpenGLの実装"です。これは技術的には正解ですが、OPにはあまり役に立ちません。あるいは、 "はい、できます"となるでしょう。コンピュータグラフィックスについてこの質問を理解する方法は、「ウィンドウ内のピクセルの色付け方法」ではなく「OpenGLを使用せずに3Dシーンをレンダリングする方法」です。前者がOPの意味だったのであれば、私の意見で言い換えればならないはずです。 – kaufmanu
多分私は良い質問をしませんでした。実際、三角形を描く関数を呼び出したときに何が起こったのか不思議です。 – Ico826