Bem vindo !

Não perca tempo, registre-se agora mesmo! Membros registrados tem acesso a muito mais conteúdos, além de poder participar de bate-papos, discussões e compartilhar novidades com a comunidade. Não perca essa oportunidade!

[Codificação] Contorno de silhueta D3D9

Discussão em 'Criações' iniciado por 'Odin, 5 Out, 2017.

Compartilhe esta Página

  1. 'Odin ╲⎝⧹ 「Night「白猫」core」 ⧸⎠╱

    Moderador Shooter
    'Odin
    Registro:
    29 Ago, 2015
    Posts:
    3,200
    Curtidas:
    2,039
    195/199
    [​IMG]

    FPS não cai. Também mostro as etapas para criar o mesmo.

    1) Crie uma textura invisível na qual desenhamos um modelo para a silhueta
    2) em drawindexedprimitiveup desenhe o modelo apropriado em textura
    3) aplique a textura de um sombreador especial
    [​IMG]
    4) renderiza a textura na tela e ficara assim
    [​IMG]


    CÓDIGO.

    1° Сria todo o necessário
    Código:
    d3ddev.GetDeviceCaps(caps);
      VERSPX1:=(inttostr( D3DSHADER_VERSION_MAJOR(caps.PixelShaderVersion)));
      VERSPX2:=(inttostr( D3DSHADER_VERSION_MINOR(caps.PixelShaderVersion)));
      STRASM:='ps_'+VERSPX1+'_'+VERSPX2+#13+'mov oC0, c0 '+#13;
      pixelshader:=nil;
      if D3DXASSEMBLESHADER(PCHAR(STRASM),length(strasm),nil,nil,0,@pshader,nil)=d3d_ok then begin
        d3ddev.CreatePixelShader(pshader.GetBufferPointer,pixelshader);
      end;
      pshader:=nil;
      d3ddev.GetRenderTarget(0,backbuffer);
      if backbuffer<>nil then backbuffer.GetDesc(desc);
      D3DDEV.CreateTexture(DESC.Width,DESC.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT,sil_texture,NIL);
      sil_texture.GetSurfaceLevel(0,rendersurface);
     
      //shader silhouette
      if D3DXCompileShaderFromFile(pchar(str+'\t.fx'),nil,nil,'main',pchar('ps_'+VERSpx1+'_'+VERSpx2),0,@pshader,nil,nil)=d3d_ok then
        d3ddev.CreatePixelShader(pshader.GetBufferPointer,sil_ps);
     
      d3ddev.CreateVertexBuffer(sizeof(TVertex2)*4, 0,fvf2,D3DPOOL_MANAGED,sil_vertex, nil);


    2° Em drawindexedprimitive
    Código:
    fl:=0;
    //define the model
    if check_model1(numvertices,promcount) then fl:=1
    if check_model2(numvertices,promcount) then fl:=2
     
    if (fl>0)  then begin
         d3ddev.CreateStateBlock(D3DSBT_ALL,pStateBlock);
     
     
        if fl=1 then begin
          r:=1;g:=1;b:=0;
        end;
        if fl=2 then begin
          r:=0;g:=1;b:=1;
        end;
     
        d3ddev.getrenderstate(d3drs_zenable,old_zenable);
        d3ddev.SetRenderTarget(0,rendersurface);//set the render to texture
        d3ddev.setrenderstate(d3drs_zenable,ifalse); //
     
        pixelvalue[0]:=r;pixelvalue[1]:=g;pixelvalue[2]:=b;pixelvalue[3]:=1;
        d3ddev.SetPixelShader(pixelshader);
        d3ddev.SetPixelShaderConstantF(0,@pixelvalue,1);
        result := or_drawindexedprimitive(self,_Type,BasevertexIndex,Minvertexindex,Numvertices,Startindex,Primcount);
     
        /////
        if fl=1 then begin
          r:=1;g:=0;b:=0;
        end;
        if fl=2 then begin
          r:=0;g:=1;b:=0;
        end;
        d3ddev.setrenderstate(d3drs_zenable,old_zenable);
        pixelvalue[0]:=r;pixelvalue[1]:=g;pixelvalue[2]:=b;pixelvalue[3]:=1;
        d3ddev.SetPixelShader(pixelshader);
        d3ddev.SetPixelShaderConstantF(0,@pixelvalue,1);
        result := or_drawindexedprimitive(self,_Type,BasevertexIndex,Minvertexindex,Numvertices,Startindex,Primcount);
     
        ////
     
     
        d3ddev.SetRenderTarget(0,oldrendersurface);//restore render
        d3ddev.SetPixelShader(oldpixelshader);
        d3ddev.SetPixelShaderConstantF(0,@oldpixelvalue,1);
     
        pStateBlock.apply;
        pStateBlock:=nil;
      end;
      result := or_drawindexedprimitive(self,_Type,BasevertexIndex,Minvertexindex,Numvertices,Startindex,Primcount);


    3° desenhar textura
    Código:
    procedure draw_texture(x1,y1,x2,y2:single;texture:idirect3dtexture9;ps:idirect3dpixelshader9);
    var
      Vertices: array [0..3] of TVertex2;
      pVertices: Pointer;
    begin
     // structure of vertecis
      //fvf2 = D3DFVF_XYZRHW or D3DFVF_TEX1;
      //TVertex2 = record
      //   x,y,z,rhw: single;
      //   tu,tv: single;
      // end;
     
     
      if d3ddev=nil then exit;
      if sil_vertex=nil then exit;
     
      Vertices[0].x := x1; Vertices[0].y := y1; Vertices[0].z := 0; Vertices[0].rhw := 1;
      Vertices[0].tu := 0; Vertices[0].tv := 0;
     
      Vertices[1].x := x2; Vertices[1].y := y1; Vertices[1].z := 0; Vertices[1].rhw := 1;
      Vertices[1].tu := 1; Vertices[1].tv := 0;
     
      Vertices[2].x := x1; Vertices[2].y := y2; Vertices[2].z := 0; Vertices[2].rhw := 1;
      Vertices[2].tu := 0; Vertices[2].tv := 1;
     
      Vertices[3].x := x2; Vertices[3].y := y2; Vertices[3].z := 0; Vertices[3].rhw := 1;
      Vertices[3].tu := 1; Vertices[3].tv := 1;
     
     
      Result := sil_vertex.Lock(0, sizeof(TVertex2)*4, pVertices, 0);
      if FAILED(Result) then Exit;
      Move(Vertices[0], pVertices^, sizeof(TVertex2)*4);
      sil_vertex.Unlock;
     
     
      d3ddev.CreateStateBlock(D3DSBT_ALL,pStateBlock);
      d3ddev.SetPixelShader(NIL);
     
      d3ddev.SetPixelShader(ps);
      d3ddev.SetTexture(0,texture);
      d3ddev.SetStreamSource(0,sil_vertex, 0, sizeof(TVertex2));
      d3ddev.SetFVF(FVF2);
     
      d3ddev.DrawPrimitive(D3DPT_trianglestrip , 0, 2);
     
      pStateBlock.apply;
      pStateBlock:=nil;
     
    end;

    // No final da vida
    Código:
    //
      draw_texture(0,0,desc.Width,desc.Height,sil_texture,sil_ps);
     
      result := or_endscene(self);
       //clear texture
       if d3ddev<>nil then begin
        d3ddev.GetRenderTarget(0,oldrendersurface);
        d3ddev.SetRenderTarget(0,rendersurface);
        drawrect(0,0,desc.Width,desc.Height,0,0,0);
        d3ddev.SetRenderTarget(0,oldrendersurface);
      end;

    // SHADER Silhueta
    Código:
    //shader silhouette by Baunti
    sampler TextureSampler;
     
    struct PixelInput
    {
        float2 TexCoord : TEXCOORD0;
    };
     
     
    float sum(float4 a)
    {
      return(a[0]+a[1]+a[2]+a[3]);
    };
     
    float4 main(PixelInput input) : COLOR0
     
    {
        float xx = 0.003; //width of silhouette
        float4 colorout;
        float4 color = tex2D(TextureSampler, float2(input.TexCoord.x, input.TexCoord.y ));
        float4 color1 = tex2D(TextureSampler, float2(input.TexCoord.x+xx, input.TexCoord.y ));
        float4 color2 = tex2D(TextureSampler, float2(input.TexCoord.x-xx, input.TexCoord.y ));
        float4 color3 = tex2D(TextureSampler, float2(input.TexCoord.x, input.TexCoord.y+xx ));
        float4 color4 = tex2D(TextureSampler, float2(input.TexCoord.x, input.TexCoord.y-xx ));
        colorout = color;
     
     
     
        if ((sum(color1)>0)&&(sum(color)==0))
        {
           colorout=color1;
        };
     
        if ((sum(color2)>0)&&(sum(color)==0))
        {
           colorout=color2;
        };
       
        if ((sum(color3)>0)&&(sum(color)==0))
        {
           colorout=color3;
        };
       
        if ((sum(color4)>0)&&(sum(color)==0))
        {
           colorout=color4;
        };
     
     
        if (sum(color)>0)
        {
          colorout=0;
        };
     
       
        return (colorout);
    }

    ++ glass chams
    Código:
    //shader by Baunti
     sampler TextureSampler;
     
    struct PixelInput
    {
        float2 TexCoord : TEXCOORD0;
    };
     
     
    float sum(float4 a)
    {
      return(a[0]+a[1]+a[2]+a[3]);
    };
     
    float4 main(PixelInput input) : COLOR0
     
    {
        float xx = 0.004;
        float4 color = tex2D(TextureSampler, float2(input.TexCoord.x, input.TexCoord.y ));
        float4 color1 = tex2D(TextureSampler, float2(input.TexCoord.x+xx, input.TexCoord.y ));
        float4 color2 = tex2D(TextureSampler, float2(input.TexCoord.x-xx, input.TexCoord.y ));
        float4 color3 = tex2D(TextureSampler, float2(input.TexCoord.x, input.TexCoord.y+xx ));
        float4 color4 = tex2D(TextureSampler, float2(input.TexCoord.x, input.TexCoord.y-xx ));
     
        float4 colorout = color;
       
         if ((sum(color1)>0)&&(sum(color)==0))
        {
           colorout=color1;
           colorout[3]=0.7;
        };
     
        if ((sum(color2)>0)&&(sum(color)==0))
        {
           colorout=color2;
           colorout[3]=0.7;
        };
       
        if ((sum(color3)>0)&&(sum(color)==0))
        {
           colorout=color3;
           colorout[3]=0.7;
        };
       
        if ((sum(color4)>0)&&(sum(color)==0))
        {
           colorout=color4;
           colorout[3]=0.7;
        };
     
     
     
        if (color[3]>0)
        {
          colorout[3]=0.2;
        };
       
     
       
        return (colorout);
    }

    O processo fica mais fácil em jogo que já lhe da a função neles mesmo
    como CS:GO com o Glow ESP & Warface com o Contorno ESP
    nesses jogo já tem uma função que vemos o contorno de outros players

    tentei em uns 3 jogo e cada um temos que redefinir alguma funções para que trabalhe.
     
    Última edição: 18 Out, 2017 às 20:10
    before123 e Arkanun1000 curtiram isso.
  2. before123 Prazer Sou Keitty *-*

    Membro Avançado
    before123
    Registro:
    5 Fev, 2012
    Posts:
    369
    Curtidas:
    47
    60/67
    Mto bom..Obrigado por compartilhar
     
    'Odin curtiu isso.
  3. Cr4cko software architect & fullstack developer

    Moderador Programador
    Cr4cko
    Registro:
    20 Dez, 2012
    Posts:
    1,231
    Curtidas:
    183
    75/133
    O conteúdo é bom, só precisa dar uma formatada melhor porque o código ficou centralizado e isso é péssimo para leitura.
    Ficou também meio no espaço o que o tópico quer dizer. Eu tenho vontade de entender como desenhar dentro de qualquer jogo,
    se posso fazer uns desenhos ou coisa do tipo e compilar numa dll injetar e funcionar. Abraços!
     
    'Odin curtiu isso.
  4. ML-OliD

    Membro
    ML-OliD
    Registro:
    30 Out, 2016
    Posts:
    44
    Curtidas:
    18
    10/34
  5. 'Odin ╲⎝⧹ 「Night「白猫」core」 ⧸⎠╱

    Moderador Shooter
    'Odin
    Registro:
    29 Ago, 2015
    Posts:
    3,200
    Curtidas:
    2,039
    195/199

    Resolvido o centralizar
    So que para desenhar dentro do jogo você já tem que ter entendimento de ViewMatrix e EntiyPosition
    já que terá que converter 3D (mundo do jogo) para 2D (Sua tela) no caso de ESPs (extra sensorial position)
    Depois vem antiFlick, checkVisible, colors bla bla bla e por ai vai...

    já fica para um compiladão que posso esta fazendo​
     
    Última edição: 18 Out, 2017 às 22:55
    Cr4cko curtiu isso.
Top