2010-10-10 98 views
1

假设我有一些几何数据,我希望以线框模式呈现它。显然,这可以使用API​​ 来完成(例如,通过在DirectX中设置一些适当的模式,如D3DFILL_WIREFRAME)。C++着色器问题

但我有兴趣,如果这是可能的使用顶点/几何/像素着色器实现(合并的可能)。

有人有样品吗?

谢谢。

+1

好的代码,“C++”是一种编程语言,是不可知的东西更高的水平,这将是能够呈现的。这听起来像你指的是DirectX?还是那个例子,你在谈论OpenGL?还是其他什么东西? – EboMike 2010-10-10 21:59:51

+0

@EboMike *我很感兴趣,如果这实际上是可能的,显然,如果它需要着色器代码。* HLSL/GLSL/Cg - 没关系,因为它不是很难移植。可能C++标签是错误的。 – 2010-10-10 22:02:12

回答

2

也许像http://wn.com/DirectX_C++__Geometry_with_Wireframe_Effect

试试这个:http://cgg-journal.com/2008-2/06/index.html - 底部

// ------------------ Vertex Shader -------------------------------- 
#version 120 
#extension GL_EXT_gpu_shader4 : enable 
void main(void) 
{ 
    gl_Position = ftransform(); 
} 


// ------------------ Geometry Shader -------------------------------- 
#version 120 
#extension GL_EXT_gpu_shader4 : enable 

uniform vec2 WIN_SCALE; 
noperspective varying vec3 dist; 
void main(void) 
{ 
    vec2 p0 = WIN_SCALE * gl_PositionIn[0].xy/gl_PositionIn[0].w; 
    vec2 p1 = WIN_SCALE * gl_PositionIn[1].xy/gl_PositionIn[1].w; 
    vec2 p2 = WIN_SCALE * gl_PositionIn[2].xy/gl_PositionIn[2].w; 

    vec2 v0 = p2-p1; 
    vec2 v1 = p2-p0; 
    vec2 v2 = p1-p0; 
    float area = abs(v1.x*v2.y - v1.y * v2.x); 

    dist = vec3(area/length(v0),0,0); 
    gl_Position = gl_PositionIn[0]; 
    EmitVertex(); 

    dist = vec3(0,area/length(v1),0); 
    gl_Position = gl_PositionIn[1]; 
    EmitVertex(); 

    dist = vec3(0,0,area/length(v2)); 
    gl_Position = gl_PositionIn[2]; 
    EmitVertex(); 

    EndPrimitive(); 
} 


// ------------------ Fragment Shader -------------------------------- 
#version 120 
#extension GL_EXT_gpu_shader4 : enable 

noperspective varying vec3 dist; 
const vec4 WIRE_COL = vec4(1.0,0.0,0.0,1); 
const vec4 FILL_COL = vec4(1,1,1,1); 

void main(void) 
{ 
    float d = min(dist[0],min(dist[1],dist[2])); 
    float I = exp2(-2*d*d); 
    gl_FragColor = I*WIRE_COL + (1.0 - I)*FILL_COL; 
} 
+0

好吧,是的,就是这样,但我在寻找着色器代码,这样我就不会重新发明轮子。 – 2010-10-10 22:02:59

+0

看起来不错,谢谢。 – 2010-10-10 22:08:26

+0

没问题,很高兴我可以帮助:) – 2010-10-10 22:23:59