Line to Quad shader

OpenGL에서 Line을 Quad로 변경하는 OpenGL Geometry 쉐이더..
screen_size 는 viewport width, height 의 값.

아래는 메시의 edge (wireframe) 를 그린것인데..

line_width를 1.0으로 하면.. Line 처럼 보이지만..

10.0으로 변경하면..

요렇게 Quad Primitive 로 라인을 그린걸 볼수 있음.

이렇게 Line을 Quad로 그리는 이유는
1. 속도 때문. 태초에 OpenGL 은 Triangle (Quad는 내부적으로 Triangle 두개로 표현됨) 을 그리는데 빠른 성능을 내기때문임.
2. Line은 offset (glPolygonOffset)을 할수 없어서 Face 위에 정확하게 라인을 그리기가 어려움. 이렇게 Quad로 변경해서 그리면 Offset 이 가능하므로 선을 surface 위에 이쁘게 그릴수가 있음.

#version 400 compatibility
layout(lines) in;
layout(triangle_strip, max_vertices = 4) out;

uniform float line_width;
uniform vec2 screen_size;

void main()
{
  // start/end points of line
  vec4 p0 = gl_in[0].gl_Position;
  vec4 p1 = gl_in[1].gl_Position;
  
  // convert to screen space
  p0.xy = p0.xy / p0.w * screen_size;
  p1.xy = p1.xy / p1.w * screen_size;

  // compute dir and normal
  vec2 lineDir = p1.xy - p0.xy;
  vec2 lineNormal = normalize(vec2(-lineDir.y, lineDir.x));
  
  
  // create screen-aligned quad
  vec2 offset = lineNormal * line_width;


  gl_Position = vec4( (p0.xy + offset) * p0.w / screen_size, p0.z, p0.w);
  EmitVertex();
  
  gl_Position = vec4( (p0.xy - offset) * p0.w / screen_size, p0.z, p0.w);
  EmitVertex();
  
  gl_Position = vec4( (p1.xy + offset) * p1.w / screen_size, p1.z, p1.w);
  EmitVertex();
  
  gl_Position = vec4( (p1.xy - offset) * p1.w / screen_size, p1.z, p1.w);
  EmitVertex();
  
  EndPrimitive();
}

OpenGL 로 만드는 해석 모델 편집기..

요즘 짜투리 시간을 이용해서..
OpenGL로 해석 모델을 편집하는 프로그램을 만들고 있다..
이래저래 문제도 많았는데..
하나둘씩 해결이 되고 있다..

투명문제도.. 텍스트 출력 속도도.. 해결이 되었음..

파트가 너무 많으면.. 인덱스 트랜스퍼가 너무 많다보니.. 느림..
이건 꼭 해결하고 넘어가야할 산…

아래는 인터넷상에 굴러다니는 모델을 불러온 화면..

Outline 그리기

opengl 에서 outline을 그리는 몇가지 방법중의 하나..
바로 stencil buffer 를 이용함.

glPushAttrib(GL_ALL_ATTRIB_BITS);

glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
glEnable(GL_STENCIL_TEST);
// Set the stencil buffer to write a 1 in every time
// a pixel is written to the screen
glStencilFunc(GL_ALWAYS, 1, 0xFFFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glColor3f(1.0f, 0.0f, 0.0f);

...draw primitive...

glStencilFunc(GL_NOTEQUAL, 1, 0xFFFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
// Draw the object with thick lines
glLineWidth(4.0f);
glDisable (GL_LINE_SMOOTH);
glDisable(GL_LIGHTING);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor3f(1.0f, 1.0f, 1.0f);

...draw primitive...

glPopAttrib();

NETGEN

출처: http://sourceforge.net/projects/netgen-mesher/

NETGEN is an automatic 3d tetrahedral mesh generator. It accepts input from constructive solid geometry (CSG) or boundary representation (BRep) from STL file format. The connection to a geometry kernel allows the handling of IGES and STEP files. NETGEN contains modules for mesh optimization and hierarchical mesh refinement. Netgen is open source based on the LGPL license. It is available for Unix/Linux and Windows.

Tcl/Tk Opengl 의 조합으로 만들어진 오픈소스 Mesh generator 프로그램.

코드를 파보면 Tk위에 OpenGL을 어떻게 붙이고.. 어떤 방향으로 코딩을 해야하는지 알 수 있을것임.

다운로드: netgen-5.1-RC.zip, Netgen_ext_libs.zip

MyGUI

홈페이지: http://mygui.info/

게임 제작시 유용한 GUI 툴킷. opengl, ogre3d, direct-x를 지원함.
여기서는 opengl 랜더링을 사용하도록 컴파일 되었음.

% cmake -G "MSYS Makefiles" -DCMAKE_INSTALL_PREFIX=/works/mingw-libs/release/my-gui-trunk -DMYGUI_RENDERSYSTEM=3
% make; make install

MyGUI is a library for creating Graphical User Interfaces (GUIs) for games and 3D applications. The main goals of mygui are: speed, flexibility and ease of use.

다운로드: 3.2.0 rc1 (데모도 포함되어있음)

freeglut

홈페이지: http://freeglut.sourceforge.net/

freeglut is a completely OpenSourced alternative to the OpenGL Utility Toolkit (GLUT) library. GLUT was originally written by Mark Kilgard to support the sample programs in the second edition OpenGL ‘RedBook’. Since then, GLUT has been used in a wide variety of practical applications because it is simple, widely available and highly portable.

GLUT (and hence freeglut) allows the user to create and manage windows containing OpenGL contexts on a wide range of platforms and also read the mouse, keyboard and joystick functions.

freeglut is released under the X-Consortium license.

다운로드: 2.6.0, 2.6.0

glew

홈페이지: http://glew.sourceforge.net/

opengl의 확장.

The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. OpenGL core and extension functionality is exposed in a single header file. GLEW has been tested on a variety of operating systems, including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris.

다운로드: 1.5.1

Clutter

홈페이지: http://clutter-project.org/

c언어로 구현한 2D 그래픽 사용자 인터페이스 라이브러리.
2D임에도 불구하고 OpenGL 또는 OpenGL ES를 렌더링에 사용하며, GLib의 GObject 기반으로 API가 구성되어 있다.

Clutter is an open source software library for creating fast, visually rich, portable and animated graphical user interfaces.

Clutter uses OpenGL (and optionally OpenGL|ES for use on Mobile and embedded platforms) for rendering but with an API which hides the underlying GL complexity from the developer. The Clutter API is intended to be easy to use, efficient and flexible.

다운로드: 0.8.8, 1.0.0
데모 다운로드: clutter-test-mingw.7z

아래는 테스트 해본 화면..
clone-test1
cline-test2
image-viewer
Clutter로 제작된 Moblin UI

Mesa3D

홈페이지: http://mesa3d.sourceforge.net/

OpenGL API와 호환성을 갖는 라이브러리이다.

대부분의 상용 운영체제에서는 SGI에서 라이선스받은 정식 OpenGL 라이브러리가 지원되지만 리눅스는 그렇지 못하다. 사실 리눅스에서 사용하는 OpenGL은 정식 OpenGL이 아니라 Mesa3D(www.mesa3d.org)라는 이름의 OpenGLAPI를 그대로 구현한 공개 라이브러리다

Mesa is an open-source implementation of the OpenGL specification – a system for rendering interactive 3D graphics.

A variety of device drivers allows Mesa to be used in many different environments ranging from software emulation to complete hardware acceleration for modern GPUs.

Mesa ties into several other open-source projects: the Direct Rendering Infrastructure and X.org to provide OpenGL support to users of X on Linux, FreeBSD and other operating systems.

컴파일시 같은 디렉토리내에 MesaLib-7.4.4.tar.gz, MesaGLUT-7.4.4.tar.gz, MesaDemos-7.4.4.tar.gz 이 파일들을 풀고, make -f Makefile.mgw 를 수행한다.

다운로드: 7.4.4
샘플 다운로드: mesa3d-test-mingw.7z