2010-10-10 4 views
1

Supposons que je possède des données géométriques et que je souhaite le rendre en mode filaire. Évidemment, cela peut être fait en utilisant l'API (par exemple, en définissant un mode approprié comme D3DFILL_WIREFRAME dans DirectX).Question shader C++

Mais je me suis intéressé si cela est possible de réaliser en utilisant vertex/géométrie/pixel shaders (combinés, probablement).

Est-ce que quelqu'un en a un échantillon?

Merci.

+1

D'accord, « C++ » est un langage de programmation qui est agnostique à tout niveau supérieur qui serait capable de rendre. Il semble que vous faites référence à DirectX? Ou était-ce un exemple, et vous parlez d'OpenGL? Ou quelque chose d'autre entièrement? – EboMike

+0

@EboMike * Je me suis intéressé si c'est réellement possible et, évidemment, je veux le code de shader pour cela. * HLSL/GLSL/Cg - ce n'est pas grave, car ce n'est pas si difficile à mettre en communication. Probablement, tag C++ est le mauvais. –

Répondre

2

Peut-être quelque chose comme http://wn.com/DirectX_C++__Geometry_with_Wireframe_Effect?

Essayez ceci: http://cgg-journal.com/2008-2/06/index.html - code en bas

// ------------------ 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

Eh bien, oui, c'est ça, mais je cherche du code shader pour ne pas réinventer la roue. –

+0

Ça a l'air bien, merci. –

+0

Pas de problème, content de pouvoir aider :) –