2012年4月28日土曜日

8 ̑OpenGLg


8 ̑OpenGLg

̏͂ł̓eNX`A摜AGLXgAɃO[sOɂ‚̊gKȗĐ܂B
ł͈ȉɕtĊwт܂:


|SItZbgg(EXT_polygon_offset) ͉BC[W̕`AnCCgꂽGbW̃\bh̕`A\ʂɓ]ʉ(decal)ZbgꍇȂǂɗLłB

̊ǵAƂΕ\ʂ̃AEgC`悵ꍇȂǂɕ֗ɂȂ܂B
̓|Sƈ�= XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); swa.border_pixel = 0; swa.event_mask = ExposureMask | StructureNotifyMask | KeyPressMask | ButtonPressMask | ButtonMotionMask; win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 900, 300, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel|CWColormap|CWEventMask, &swa); XStoreName(dpy, win, "hiddenline"); XMapWindow(dpy, win); glXMakeCurrent(dpy, win, cx); /* PolygonOffsetgp"\`FbN */ if (!query_extension("GL_EXT_polygon_offset")) error(argv[0], "polygon_offset extension is not available"); /* r[COp[^ݒ */ glMatrixMode(GL_PROJECTION); gluPerspective(20, 1, 0.1, 20); glMatrixMode(GL_MODELVIEW); glTranslatef(0, 0, -15); /* ̑̓K؂ȏԏݒ */ glEnable(GL_DEPTH_TEST); glPolygonOffsetEXT(1.0, 0.000001); /* [U[ESC܂ł̃Cxg */ while (1) process_input(dpy, win); } static void draw_scene(int mx, int my) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(-1.7, 0.0, 0.0); cubes(mx, my, WIREFRAME); glPopMatrix(); glPushMatrix(); cubes(mx, my, HIDDEN_LINE); glPopMatrix(); glPushMatrix(); glTranslatef(1.7, 0.0, 0.0); glEnable(GL_POLYGON_OFFSET_EXT); cubes(mx, my, HIDDEN_LINE); glDisable(GL_POLYGON_OFFSET_EXT); glPopMatrix(); } static void cubes(int mx, int my, int mode) { int x, y, z, i; /* }EXgbN */ glRotatef(mx / 2.0, 0, 1, 0); glRotatef(my / 2.0, 1, 0, 0); /* BƂă|S` */ glTranslatef(-0.5, -0.5, -0.5); glScalef(1.0/dimension, 1.0/dimension, 1.0/dimension); for (z = 0; z < dimension; z++) { for (y = 0; y < dimension; y++) { for (x = 0; x < dimension; x++) { glPushMatrix(); glTranslatef(x, y, z); glScalef(0.8, 0.8, 0.8); for (i = 0; i < MAXQUAD; i++) draw_hidden(quads[i], mode); glPopMatrix(); } } } } static void fill(Quad quad) { /* hׂꂽ|S` */ glBegin(GL_QUADS); glVertex3fv(quad[0]); glVertex3fv(quad[1]); glVertex3fv(quad[2]); glVertex3fv(quad[3]); glEnd(); } static void outline(Quad quad) { /* |S̗֊s` */ glBegin(GL_LINE_LOOP); glVertex3fv(quad[0]); glVertex3fv(quad[1]); glVertex3fv(quad[2]); glVertex3fv(quad[3]); glEnd(); } static void draw_hidden(Quad quad, int mode) { /* ֊s𔒂ŕ`BIvVœœhׂ */ glColor3f(1, 1, 1); outline(quad); if (mode == HIDDEN_LINE) { glColor3f(0, 0, 0); fill(quad); } } static void process_input(Display *dpy, Window win) { XEvent event; static int prevx, prevy; static int deltax = 90, deltay = 40; do { char buf[31]; KeySym keysym; XNextEvent(dpy, &event); switch(event.type) { case Expose: break; case ConfigureNotify: { /* ̃Av[`̓r[|[g1:1̃AXyNgVIɐݒ肷B*/ int vX, vY, vW, vH; int eW = event.xconfigure.width, eH = event.xconfigure.

花崗岩の鉄のフックをインストールする方法
height; if (eW >= eH) { vX = 0; vY = (eH - eW) >> 1; vW = vH = eW; } else { vX = (eW - eH) >> 1; vY = 0; vW = vH = eH; } glViewport(vX, vY, vW, vH); } break; case KeyPress: (void) XLookupString(&event.xkey, buf, sizeof(buf), &keysym, NULL); switch (keysym) { case XK_Escape: exit(EXIT_SUCCESS); default: break; } case ButtonPress: prevx = event.xbutton.x; prevy = event.xbutton.y; break; case MotionNotify: deltax += (event.xbutton.x - prevx); prevx = event.xbutton.x; deltay += (event.xbutton.y - prevy); prevy = event.xbutton.y; break; default: break; } } while (XPending(dpy)); draw_scene(deltax, deltay); glXSwapBuffers(dpy, win); } static void error(const char *prog, const char *msg) { fprintf(stderr, "%s: %s\n", prog, msg); exit(EXIT_FAILURE); } static int query_extension(char* extName) { char *p = (char *) glGetString(GL_EXTENSIONS); char *end = p + strlen(p); while (p < end) { int n = strcspn(p, " "); if ((strlen(extName) == n) && (strncmp(extName, p, n) == 0)) return GL_TRUE; p += (n + 1); } return GL_FALSE; }

}8-1 |SItZbgggp


_zg(EXT_vertex_array)͕̊􉽃v~eBũTu[`R[Ŏw肷邱Ƃ"\ɂ܂B
̐߂ł͍ŏɁAȂEĂǂ̂悤ȏꍇɂ̊g𗘗p邱ƂɂȂ̂Aꂩ炱̊gǂ̂悤ɓ삷邩Aɂ͐ÓI܂͔ÓIzɊւc_Ɨp@ɂ‚Čy܂B


ȂEĂǂ̂悤ȏꍇɒ_zg𗘗p̂

ꂼ̓Ɨ_A@A͐Fn߂OpenGLvV[WĂяoɁA_E@EF̕ʁX̔zw肵Av~eBũV[PX(ׂē^)w肷邱Ƃł܂B
ɂ͊֐glDrawArraysEXT()ƂP‚̊֐gp܂B

̊gɂAu܂(stride)ṽJjY񋟂AAvP[V͑SẴf[^P‚̔zɔ[߂ĂƂƂ"\ɂȂ܂B
Ƃ΁AFE_EGbW̃f[^AKvȎɂ܂(stride number)gpĊe^CvɃANZX邱Ƃł܂B
̊g͊ezvf̕`T|[gĂ܂Bevf͗LȔz̃CfbNXƂĎw肵܂B

: _zg̎gpɂptH[}X̑܂͈܂B
̊g̎gpɂAvP[Vs֐̌Ăяo񐔂͌܂Az񒆂̃f[^ɃANZX邽߂̃I[o[wbh܂B
ꂼ̌ʂC[uɂȂ|Cg̓AvP[VsVXeɂقȂ܂B
RealityEngineVXeɂ`[jOꂽɂ‚Ắu_zg̍œKꂽpvQƂĂB

VROtBbNX̃VXeł̓VOzL̏ꍇɂǂptH[}X܂B
̊g͕ɑ΂čœKĂǍ^ɑ΂Ă͍œKĂ܂B
āA‚̃ptH[}XeXgsAAvP[VɂĒ_z̗p{ɑÓȂ̂ǂ邱Ƃ߂܂B


_zg̓

̊g͌•ʂ̔zւ̃|C^[Ɣz̗vf(_E@EFEFwWEeNX`WEGbWtO)Ɋ֘AÂꂽf[^Ǘ܂B
ezɊ֘AÂf[^ɂ͈ȉ̂̂ݒ肵܂B

  • z񒆂̒l̃f[^^
  • z񒆂̗vf̒l̐(Ƃ2,3,܂4W̒_)
  • z񂩂玟̔z܂ł̃oCg
  • (ŏ琔)ÓIvf̐
    ÓIvf̓AvP[VɂďC邱Ƃł܂ACsꍇ͕`OɃAvP[V疾IɍĐݒ肵Ȃ΂Ȃ܂B

zݒ肵ꍇÃ|C^Ɗ֘Af[^̓NCAg̏ԂŕۊǂAÓIvf̓LbV܂B
‚܂vfÓIȂ̂ƂĒ`ꍇ́AglVertexPointerEXT()countgpĕύXȂƂۏ؂܂B
ÓI(I)vfglArrayElementEXT()glDrawArraysEXT()Ă΂܂ŃANZXׂł͂܂B


قȂނ̃f[^zƂĐݒ肷

̏͂͒_̔zݒ肷ꍇɂ‚Ă̏񋟂܂B@EFEFwWEeNX`WEGbWtOɂ‚Ă̐͊܂܂܂BȂ𓾂邽߂Ƀt@Xy[WQƂĂB


木彫りのためにナイフをシャープにする方法
  • glVertexPointerEXT()͒_W̔z̃f[^^ƁAꏊw肵܂B
    • pointer ɂ͔z񒆂̂PԖڂ̒_̂PԖڂ̍W̃|C^Zbg܂B
    • type ɂ͔z񒆂̊eW̃f[^^w肷Bȉ̒lw肷邱Ƃł܂B
      GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE_EXT (ꂼOpenGL̃f[^^short, int, float, doubleɑ܂B)
    • size ɂ͒_̍Ww肵܂B2A3A܂4B
    • stride ɂ͘A钸_̃|C^[Ԃ̃oCgItZbgݒ肵܂Bstride 0 ̏ꍇ͒_f[^͂̔zɂ[ĂƂ݂Ȃ܂B
    • count ͐ÓIȒ_̐w肵܂BPԖڂ琔܂B
  • glNormalPointerEXT()͖@̔z̏ꏊƃf[^tH[}bgݒ肵܂B
  • glColorPointerEXT()͐Fvf̔z̏ꏊƃf[^tH[}bgݒ肵܂B
  • glIndexPointerEXT()͐FwW̔z̏ꏊƃf[^tH[}bgݒ肵܂B
  • glTexCoordPointerEXT() ̓eNX`W̔z̏ꏊƃf[^tH[}bgݒ肵܂B
  • glEdgeFlagPointerEXT()̓GbWtO̔z̏ꏊƃf[^tH[}bgݒ肵܂B

z̕`

ftHgłׂ͂Ă̔z͖ŁAglArrayElementEXT() glDrawArraysEXT() Ă΂ĂANZX͂ł܂BezL/ɂɂ cap\8-1̒̓KȒlZbgglEnable() ܂ glDisable() Ăяo܂B

\8-1: zLɂ邽߂̃g[N

zwR}hg[N
glVertexPointerEXTGL_VERTEX_ARRAY_EXT
glNormalPointerEXTGL_NORMAL_ARRAY_EXT
glColorPointerEXTGL_COLOR_ARRAY_EXT
glIndexPointerEXTGL_INDEX_ARRAY_EXT
glTexCoordPointerEXTGL_TEXTURE_COORD_ARRAY_EXT
glEdgeFlagPointerEXTGL_EDGE_FLAG_ARRAY_EXT

glArrayElementEXT()Ă΂ꂽꍇALłziԖڂ̒_Ƒf[^ĂĂP‚̒_`悳܂B

GL_VERTEX_ARRAY_EXTLłȂꍇłAglArrayElementEXT()֐͎s܂B̏ꍇ`͍s܂񂪁ALłzɑΉ͏C܂B

glDrawArraysEXT()Ă΂ꂽꍇAfromcount‚̃V[PVȗvfALłez񂩂oāAV[PVȊ􉽃v~eBu\܂B
mode p[^ɂ͂ǂ̂悤ȃv~eBu\邩AĂ̂悤ȃv~eBu\鎞ɔz̗vfǂ̂悤Ɏgp邩w肵܂Bgpłl͈ȉB
GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_QUAD_STRIP, GL_QUADS, GL_POLYGON
GL_VERTEX_ARRAY_EXTLłȂꍇA􉽃v~eBu͐܂B

glDrawArraysEXT()ɂCꂽ_glDrawArraysEXT()烊^[Ɏw肵ȂlɃZbg܂BƂ΁AGL_COLOR_ARRAY_EXTLȏꍇAJg̐F̒lglDrawArraysEXT()sꂽ͒`ĂȂԂƂȂ܂B
ύXȂɊւĂ͂ƒ`ꂽ܂܎c܂B

glDrawArraysEXT()̎sɃG[ꍇ́Ȃ͎̏sꂸAԂ͕ω܂B

glBegin()ƑΉglEnd()̊ԂŔzĐݒ肷邱ƂŃG[͔܂񂪁Â悤ȍĒ`̌ʂ͒`Ă܂B
ÓIȔzf[^̓CvɂĂ‚łǂݍ܂LbV܂BAvP[VÓIf[^CꍇglArrayElementEXT()܂glDrawArraysEXT()Ă΂ꂽ̌ʂ͒`Ă܂B


VK̊֐

glArrayElementEXT(), glDrawArraysEXT(), glVertexPointerEXT(), glNormalPointerEXT(), glColorPointerEXT(), glIndexPointerEXT(), glTexCoordPointerEXT(), glEdgeFlagPointerEXT(), glGetPintervEXT()


}`TvgASGIS_multisampléAׂĂOpenGLv~eBu(_AA|SArbg}bvA摜)A`GCAX郁JjY񋟂܂B

̐߂̓}`Tv̗p@ƗpꍇɋN鎖ɂ‚ċc_܂Bc_͈̂ȉ̎łB


}`TvOւ̂Ȃ

}`TvÓASẴv~eBuɑ΂ĊesNZ̈قȂꏊ(ۂ̓TusNZ̏)ŕTvO邱Ƃɂ菈܂B̌ʃGCAX(alias)Ȃ摜܂B

eTv̓fvXƃXeV‚߁AfvX֐ƃXeV֐̓VOTv[hƓɎs܂B1‚̃sNZ4,8܂16̃TuTv‚Ƃł܂B

}`TvOɐFǏogpꍇ́A肳ꂽF (‚܂Tv̕) 𓾂邱ƂɂȂ܂BXeVfvXǏoꍇ́Aωꂽlł͂ȂAP‚̃Tvl܂B̃Tvl͊{IɃsNZ̒Sɍł߂̂I܂B


}`TvOgpɂ

}`TvA`GCAVO(multisample antialiasing) ̓|S̃_OɍłLłBȂȂA|S̐ڑIuWFNg̗֊sA|SȂǂ𐳊mɏł邩łBsNZXV邽тɁAesNZɑ΂J[TvlP‚̕\"\ȐFɊZ܂B

_ѐɂ‚Ă͕WOpenGLŒ񋟂uX[YA`GCAVO(smooth antialiasing)vɂāA荂iȉ摜܂̂ŁA𗘗pقǂł傤B(OpenGLvO~OKCh̑7: uufBOAA`GCAVOAĖvQƂĂ)


どのように私はれんが造りの家からデッキを構築しません

}`Tvg1‚̃V[̃_OɃ}`TvX[XA`GCAVOI邱Ƃł̂ŁA}`TvOꂽ|SƁAX[Y̐ѓ_~bNX邱Ƃ"\łBɏڂ́u}`Tvꂽ_vƁu}`TvꂽvQƂĂB


}`Tvg̎gp

AvP[V}`TvO𗘗pɂglXChooseVisual()gă}`Tv"\ȃrWAI܂Battr_listɈȉ̍ڂݒ"\łB

GLX_SAMPLES_SGIS
}`Tvobt@ɗvő̃Tvw肵܂BglXChooseVisual()͎w肵Ɍ܂͂ȏ̍łȒl̃rWAւ̃|C^Ԃ܂B}`Tvobt@̃J[Tv̓C̃J[obt@̂̂菭ȂrbgƂȂꍇ܂BA}`TṽJ[̑v̓C̃J[obt@ȂƂ̂̂Ǘ܂B
GLX_SAMPLE_BUFFERS_SGIS
̑̓IvVłB݂Pˆȏ̃}`Tvobt@ƒrWA݂͑Ȃ̂ŁAԂl0܂1łBGLX_SAMPLES_SGIS0łȂȂ΁A̒l1ftHgłB̑ݒ肷ꍇ}`Tvobt@̎󂯓ŏ̐łȂĂ͂Ȃ܂B̍ŏ̐Ɍȏ̍ŏ̐̃}`Tvobt@̃rWAI܂B

}`TvO̓ftHgŗLłB

  • }`TvOLǂ₢킹ɂ͈ȉĂяo܂B
        glIsEnabled(MULTISAMPLE_SGIS)  
        glDisable(MULTISAMPLE_SGIS)  

}`TvOIvV̍xȗp@

lj̃_O@\xȃ}`TvOIvVƂĒ񋟂܂B̏͂ł͈ȉ̂Ƃɂ‚ċc_܂B

  • ‚̃Tv݉"\I邽߂̃}`Tv}XN̎gp
  • tFU[uhEeNX`[GbŴ߂̃At@l̎gp
  • }`TvOƃAL[Vobt@(accumulation buffer)̕p

}8-2͂ǂ̂悤ɂP‚̃sNZ̃TuTvON/OFF邩Ă܂B

  1. ܂ŏɁATvp^[Œ`ʒuŃv~eBuTv܂BTv|SȂONɂȂAłȂOFFɂȂ܂BɂJo[W}XN(coverage mask)쐬܂B
  2. Jo[W}XN̓[U[(glSampleMaskSGIS()gp)`Tv}XNANDƂ܂B(utF[hLOD̂߂̃}`Tv}XN̎gpvQ)
  3. tOg̃At@l}XNɕϊstep2̃Jo[W}XNANDƂI"\łB
    At@}XNɕϊɂ GL_SAMPLE_ALPHA_TO_MASK_SGIS LɂĂBtOg̃At@l͈ꎞIȃ}XN쐬邽߂ɎgpǍɃtOg̃}XNAND܂B

}8-2: }`TvÕTṽvZX

2‚̃vZX -- glSampleMaskSGIS()ō쐬}`Tv}XN̎gpƁAtOg̃At@l̃}XNƂĂ̎gp -- ́AɈقȂʂ̂߂ɗp"\łB

GL_SAMPLE_ALPHA_TO_MASK_SGISL̏ꍇAGL_SAMPLE_ALPHA_TO_ONE_SGISLɂ邱ƂɂAufBȎOɃAt@l1ɕϊĂƂKȏꍇłB̃IvVgpȂƁAƂĐFɉe܂B

: }`TvOgpꍇAufBO̓ptH[}X𗎂Ƃ܂B̂߁Ał邱ƂłufBO͎gpȂŁÂGL_SAMPLE_MASK_SGIS ܂ GL_ALPHA_TO_MASK gpĂB


J[ufBO(Color Blending)ƃXN[EhAEgXyAV(Screen-Door Transparency)

}`TvO͖؂̃eNX`̂悤ȕsKȗ֊s̃eNX`ɓxɊg債ꍇ̃GbWڂ₯Ƃ邽߂ɗpł܂BeNX`g傳ꂽꍇ؂̗֊ssRɂȂāA؂蔲悤ɂȂ܂BAt@}`Tv}XNɕϊĂ莩RɌ悤ɂ邽߂ɁAv~eBuɑ΂ĕ̃_O(ꂼ̃_O͂lŖߍ킹Tvgp)sƂł܂Bڂɂ‚Ắu}`Tvꂽ摜̃AL[VvQƂĂB

vZXXN[EhAEgXyAVs邽߂Ɏgp邱Ƃł܂B̑̑SẴTv݂̂`悷ȂȂSẴTv̂߂ɃobNOEhяオAʂƂēȉ摜ƂȂ܂B̂Ƃ͌㕔Oʂփ|SXgAĂȂĂ悢̂łƂĂLɗpł܂B܂AufBOKvȂ̂ł荂ɏł܂B


tF[hLOD(Fade Level Of Detail)̂߂̃}`Tv}XN̎gp

P‚̃sNZ̃}`Tvʒüꕔ܂悤Ɏw肷邽߂Ƀ}XNgp邱Ƃł܂B̋@\̓rWAV~[VEAvP[Vł̃tF[hLOD(fade-level-of-detail)Cvĝɕ֗łBLOD̃x玟̃xւ̃ufBO邽߂Ƀ}`Tv}XNgp邱Ƃł܂B͎_IuWFNgɋ߂ÂɂĒɃp[Ze[WĂTuTvgpďڍׂȃf̒lj̃f[^_OĂƂɂs܂B

̂悤ɂ̃IuWFNg̊ȒPȕ\ƁAڍׂȕ\̊Ԃ̃ufBOsAđO̐߂ŋc_XN[EhAgXyAVsɂ́AglSampleMaskSGIS()ĂяoAIuWFNg̃At@lgpglSampleAlphaToMaskSGIS()Ăяo܂BȉglSampleMaskSGIS()̃vg^Cv܂B

  void glSampleMaskSGIS(GLclampf value, boolean invert);  
  • value͏C}XÑJo[Ww肵܂B[0,1]͈̔͂ŃNvĂA0̓Jo[WȂA1̓tJo[WӖ܂B
  • invert͒l̂܂܏C}XNƂĎgpꍇGL_FALSEA}XNrbgɔ]ĎgpꍇGL_TRUEw肵܂B

glSampleMaskSGIS()gpă}`Tv}XN`ɂ͈ȉ̃Xebv𓥂݂܂B


  1. GL_SAMPLE_MASK_SGISL(Enable)ɂB
  2. glSampleMaskSGIS()ĂяoBŁAƂvalue0.25ɁAinvertGL_FALSEɃZbgB
  3. xA蕡GLODŃIuWFNg_OB
  4. glSampleMadkSGIS()ēxĂяoBŁAƂvalue0.25ɁAinvertGL_TRUEɃZbgB
  5. PLODŃIuWFNg_OB
    ̎A]}XNKpĂ̂ŃTv̕WZbggp܂B
  6. 摜\B
  7. ̉ߒKvȂ傫ȃTv}XNlŌJԂB(_IuWFNgɐڋ߂Ăꍇ)

}`Tvꂽ摜̃AL[V(accumululationAςݏグ)

AL[Vobt@(accumulation buffer) ɌʂljĂ‚̃pX(pass)ʂĉ摜̕i荂߂邱Ƃł܂BAL[Vobt@͓v~eBuɑ΂郌_O𕽋ω܂B}`pX̃_Oł͍i邽߂ɊepXɂĈقȂTvʒu𗘗pKv܂B

AvP[V摜̐ςݏグƃ}`TvOɗpꍇ́AglSamplePatternSGIS()ȉ̃p^[ɐݒ肵ČĂяoƂɂȂ܂B

  • GL_1PASS_SGIS͂P̃_OpXłꂢɃA`GCAVOꂽʂ𐶐悤ɐݒ肵܂B(ꂪftHg)
  • GL_2PASS_0_SGIS GL_2PASS_1_SGIS ͂ƂɁAsNZ̃Tv_Qxw肷邽߂Ɏgp܂B܂ŏɃp^[GL_2PASS_0_SGISɂĊSɃV[_OǍGL_2PASS_1_SGISgpčĂъSɃ_O܂BQ‚̉摜AL[Vobt@ɂĕωƁAP‚̃pX2~GL_SAMPLES_SGIS‚̃Tv_Ń_O悤ȌʂɂȂ܂B
  • GL_4PASS_0_SGISAGL_4PASS_1_SGISAGL_4PASS_2_SGISAGL_4PASS_3_SGIŚA4~GL_SAMPLES_SGIS‚̃Tv_̃p^[`܂B4̃_OpXC[WςݏグĂꍇɗpł܂B

}`Tv̐ςݏグ̌ʁAVXe̔\͂g邱Ƃł܂BƂ΁Agp}VTuTvS‚܂łĂȂꍇłAQ摜_OĂ悢Ȃ΁A8‚̃TuTvŃ}`TvÔƓʂ𓾂邱Ƃ"\ɂȂ̂łB̏ꍇAL[Vobt@KvłÃobt@܂Xy[XKvƂ邱ƂɒӂĂB

Tvp^[₢킹ɂglGetIntegerv()̈pname GL_SAMPLE_PATTERN_SGISw肵ČĂяo܂Bp^[̕ύX͊Sȃ_OpX̊ԂōsȂ΂Ȃ܂B

Ȃ͑10͂́uAL[Vobt@vOpenGLvO~OKCh́ut[obt@vQƂĂB


قȂv~eBuɑ΂ă}`Tvǂ̂悤ɉe邩

̐߂ł̓}`Tvꂽ_EE|SEsNZErbg}bvɂ‚ĂƋc_Ă܂B


}`Tvꂽ_

}`TvOgpĂꍇAX[WÕqg(GL_POINT_SMOOTH_HINTAGL_LINE_SMOOTH_HINT)͖܂B}`Tvꂽ_̕i̓A`GCAVOꂽ_̕iɗ̂ŁA}`Tvꂽ|SƃA`GCAXꂽ_̎̕KvɉāA}`TvOON/OFF邱Ƃł̂oĂĂB

: RealityEngineVXeł͓_X[YqgGL_NICESTɐݒ肷邱Ƃł荂iȃ}`Tvꂽ_ł܂B(̃[h͂xȂ̂ŒӂKvłB)

  glHint(GL_POINT_SMOOTH_HINT, GL_NICEST)  

ʂ͊ۂ_ɂȂ܂B̃qgɐݒ肹ɓ_gpꍇ͏ĂȂȂ"‚"肵܂B̐߂́uxv̕ŁA}`TvOX[Yȓ_ƂƂɗpꍇ̒ӎɂ‚ČyĂ܂̂ŎQƂĂB


}`Tvꂽ

́A Ȗʐ 0 ̋敪𒆐Sɂ`Ƃă}`Tvobt@ɃTv܂B`̓̕Jg̐łBċ`̒͂̋敪̒łB`ڑ̋`͐ڐ敪Őmɐڑ̂ŁAL钸_ɂăTuTvQ`悳Ă܂悤ȂƂ͂܂B

_̏ꍇƓ悤ɁARealityEngineVXeł̓}`T vȌꍇX[Yŕ`悵ǂʂ܂B

x: GL_LINE_SMOOTH_HINTAGL_POINT_SMOOTH_HINTLɂăX[YȐƓ_`悵ꍇ́A}`TvO𖳌ɂĂƓ_`悵Ȃ΂Ȃ܂BŒӂȂĂ͂ȂȂ̂́ASẴ}`TvO`悪IĂ炱sȂ΂ȂȂƂƂłBēx}`TvOLɂĂɃ|S`悵ƂĂÃ|S͂Ȃ炸mɃA`GCAXƂ͌܂B


}`Tvꂽ|S

|S͕W̃VOTvobt@ɃTv̂ƓlɃ}`Tvobt@ɃTv܂B1‚̃J[l(̃sNZɂTuTvɂ炸)sNZŜɑ΂ĊZ܂BāAeTv􉽓IɌɃ|S̋Eɑ݂ꍇ̂݁ÃTvɂ͊ZꂽJ[l܂܂B

fvXobt@(depth-buffer)Lł΁Ae}`Tvʒu̐mȃfvXlvZꂻ̃Tv܂ׂۂ肷邽߂ɗp܂BXeVLȂ΁AeTvɑ΂ăXeVeXgs܂B

|Srbgp^[1‚̃sNẐׂẴTvʒuɑ΂ēlɓKp܂Bp^[rbg1Ȃ΁ASẴTvʒuC̑ΏۂƂčl܂Bp^[rbg0ȂΑSđΏۊOɂȂ܂B


sNZƃrbg}bṽ}`TvEX^C[[V(rasterization)

IRIS GLł́AsNZ̓}`Tv܂łBOpenGLł͂}`TvOONȂ΃sNZ͏`ƂčlA}`TvȎΏۂƂȂ܂B

sNZ}`Tvobt@ɃTv鎞AesNZ͊gx~gy̎lp`ƂĈ܂BĂ̎lp`̓|Ŝ悤ɃTv܂B

RealityEngine ɂ鍂NA(fast clear)ɂ‚Ă̏̓t@Xy[WglTagSampleBufferSGIX()QƂĂB


VK̊֐

glSampleMaskSGIS()AglSamplePatternSGIS()



These are our most popular posts:

玄関網戸 - Wikipedia

玄関網戸」という概念の実現方法は、玄関の条件により2分類でき、種類も下記のように 2分類できる。 1. 簡易或いは、単純な玄関網戸・・・閉鎖性を重視しないケース 例えば、 戸建住宅で、居住区と外部は門で遮断され、居宅玄関扉(或いは勝口扉)に対して、「 ... read more

measure screen door ソフト - Windows

無料ダウンロード measure screen door Software - NipponFile - è. ... 100+スクリーン の転移の効果 · 、任意または混合された順序で表示画像の間で切替えなさい · マルチ モニタサポート ... ポイント、パイカ活字、インチ、フィート、ヤード、センチメートル、 ミリメートル及びメートルの測定 · nのための計数逓減率は ... どのCD -ドアガードであり 、 どうしてそれを使うべきか? ... モービーエイリアンのように、デスクトップ、小型で 大きな。 read more

BKTF 用語解説

マーティ に「市長になる」 と予言されて「町を浄化してみせる」 と意気込むが、店の主人 に「まずは床をきれいにしろ」とたしなめられる。 ... 新作だよ、これ」と言うロレーンの弟に 「再放送(rerun)で見た」 と説明するが、当時そのような語はまだ存在しない。 ... 現在の 時刻、目標時刻、最後に時間移動を行なった時刻を表示する。 .... 潜水艦に付いた網戸 みたいに馬鹿らしい」 という慣用句を、ビフは"as a screen door on a battleship"「軍艦 に付いた網戸」と ... ドクが眠らせたはずが催眠装置の効果が弱く、カフェ80sに 現われる。 read more

札幌市営地下鉄 - Wikipedia

札幌市交通事業の設置等に関する条例」を根拠として軌道事業(札幌市電)と共に設置 されている市営交通で、地方公営企業である ... 走行路面上を新交通システムのように 主輪のゴムタイヤで駆動して、走行路面中央にある1本のレールを案内軌条とする。 ... 式に比べて惰性走行時の速度低下が激しいため、惰性走行をあまり効果的に使えず、 その結果消費電力が大きくなりがちである。 ... 南北線 (N):南北 (Namboku) 線の頭 文字から; 東西線 (T):東西 (Tozai) 線の頭文字から; 東豊線 (H):東豊 (Toho) 東西線 のTとの ... read more

0 件のコメント:

コメントを投稿