• Как умножить текстуры в шейдере Unity?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Шейдеры для прожекторов работают точно так же, просто uv-карта рассчитывается по-другому:
    Projector/Multiply
    Shader "Projector/Multiply"
    {
        Properties
        {
            _ShadowTex("Cookie", 2D) = "gray" {}
            _FalloffTex("FallOff", 2D) = "white" {}
            // Добавляем свойство
            _MaskTex("Mask", 2D) = "white" {}
        }
        Subshader
        {
            Tags {"Queue"="Transparent"}
            Pass
            {
                ZWrite Off
                ColorMask RGB
                Blend DstColor Zero
                Offset -1, -1
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma multi_compile_fog
                #include "UnityCG.cginc"
                
                struct v2f
                {
                    float4 uvShadow : TEXCOORD0;
                    float4 uvFalloff : TEXCOORD1;
                    UNITY_FOG_COORDS(2)
                    float4 pos : SV_POSITION;
                };
                
                float4x4 unity_Projector;
                float4x4 unity_ProjectorClip;
                
                v2f vert (float4 vertex : POSITION)
                {
                    v2f o;
                    o.pos = UnityObjectToClipPos(vertex);
                    o.uvShadow = mul(unity_Projector, vertex);
                    o.uvFalloff = mul(unity_ProjectorClip, vertex);
                    UNITY_TRANSFER_FOG(o,o.pos);
                    return o;
                }
                
                sampler2D _ShadowTex;
                sampler2D _FalloffTex;
                // Добавляем переменную, чтобы использовать текстуру внутри прохода
                sampler2D _MaskTex;
                
                fixed4 frag (v2f i) : SV_Target
                {
                    fixed4 texS = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
                    texS.a = 1.0 - texS.a;
    
                    fixed4 texF = tex2Dproj(_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
                    fixed4 res = lerp(fixed4(1, 1, 1, 0), texS, texF.a);
    
                    // Сэмплируем текстуру
                    fixed4 mask = tex2Dproj(_MaskTex, UNITY_PROJ_COORD(i.uvShadow));
                    // Применяем маску
                    res *= mask;
    
                    UNITY_APPLY_FOG_COLOR(i.fogCoord, res, fixed4(1, 1, 1, 1));
                    return res;
                }
                ENDCG
            }
        }
    }

    Чтобы лучше понять что из себя представляют uvShadow и uvFalloff, можете вывести их на экран во фрагментном шейдере:
    fixed4 frag (v2f i) : SV_Target
    {
        float2 uvShadow = UNITY_PROJ_COORD(i.uvShadow);
        float2 uvFalloff = UNITY_PROJ_COORD(i.uvFalloff);
        return fixed4(uvShadow, 0.0, 1.0);
        //return fixed4(uvFalloff, 0.0, 1.0);
    }
    Ответ написан
  • Unity3D. Как найти сервер в локальной сети?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    UDP broadcast: 255.255.255.255
    Затем отвечают те клиенты, которые хотят, чтобы их видели и в ответных пакетах - будут их IP-шники.
    Ответ написан
  • Как открыть 64-битный png средствами delphi или c#?

    @x128
    Набросал небольшой пример на Delphi. Ключевой момент ExtraScanline.
    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      System.SysUtils,
      System.Math,
      Vcl.Imaging.PNGImage;
    
    type
      TRGB = record
        r,g,b: single;
      end;
      TIMG = record
        xmax, ymax: integer;
        data: array of array of TRGB;
      end;
    
    function LoadPNG48(var img: TIMG; const fname: string): boolean;
    var
      png: TPNGImage;
      x,y: integer;
      scan,extra: pRGBLine;
    begin
      png:=TPNGImage.Create;
      png.LoadFromFile(fname);
      result:=png.Header.BitDepth=16;
      if result then begin
        img.xmax:=png.Width;
        img.ymax:=png.Height;
        SetLength(img.data, png.Height, png.Width);
        for y:=0 to img.ymax-1 do begin
          scan:=png.Scanline[y];
          extra:=png.ExtraScanline[y];
          for x:=0 to img.xmax-1 do begin
            img.data[y,x].r:=(scan[x].rgbtRed shl 8 + extra[x].rgbtRed) / 65535;
            img.data[y,x].g:=(scan[x].rgbtGreen shl 8 + extra[x].rgbtGreen) / 65535;
            img.data[y,x].b:=(scan[x].rgbtBlue shl 8 + extra[x].rgbtBlue) / 65535;
          end;
        end;
      end;
      png.Free;
    end;
    
    procedure SavePNG24(var img: TIMG; const fname: string);
    var
      png: TPNGImage;
      x,y: integer;
      scan: pRGBLine;
    begin
      png:=TPNGImage.CreateBlank(COLOR_RGB, 8, img.xmax, img.ymax);
      for y:=0 to img.ymax-1 do begin
        scan:=png.Scanline[y];
        for x:=0 to img.xmax-1 do begin
          scan[x].rgbtRed:=round(img.data[y,x].r*255);
          scan[x].rgbtGreen:=round(img.data[y,x].g*255);
          scan[x].rgbtBlue:=round(img.data[y,x].b*255);
        end;
      end;
      png.SaveToFile(fname);
    end;
    
    var
      img: TIMG;
      x,y: integer;
    begin
      if LoadPNG48(img, 'test48.png') then begin
        for y:=0 to img.ymax-1 do begin
          for x:=0 to img.xmax-1 do begin
            img.data[y,x].r:=power(img.data[y,x].r, 1 / 2.2);
            img.data[y,x].g:=power(img.data[y,x].g, 1 / 2.2);
            img.data[y,x].b:=power(img.data[y,x].b, 1 / 2.2);
          end;
        end;
        SavePNG24(img, 'test24.png');
      end;
    end.
    Ответ написан
  • Какие разделы английского стоит выучить для фриланса?

    @heartdevil
    плыву как воздушный шарик
    Учите сугубо ИТ английский.

    Открою секрет.

    Сидите часто на stackoverflow и читайте самые популярные вопросы и ответы от крутых разработчиков (владеющих отличным английским). Там легко понять уровень английского по ответам и вопросам. Это поможет не только "вариться" в своей среде, но и "вариться" по-английски. Запоминайте структуру сложных вопросов. И как они вообще подготавливаются. Далее смотрите, как на них отвечают. Зачастую, всегда просят описать задачу. Что, собственно, на самом деле и происходит на фрилансе. Далее, просят уточнить некоторые моменты. Затем постят свои решения с описаниями. Тут тоже нужно уделить внимание на подготовку ответа. Часто, конечно, это просто код)), но вам никто не запрещает, к примеру, спросить уточнения (не для понимания кода или алгоритма, а для понимания того, как разработчик будет разжевывать вам ответ на английском ;-)), если самолюбие позволяет)). Можете даже выписывать отдельные словосочетания, которые они применяют. К примеру, создал массив, присвоил значения переменной, пробежался циклом по массиву, создал класс, имплементировал интерфейс, перегрузил чего-то там и так далее.

    В таком ритме быстро научитесь понимать вопросы на английском и умело отвечать, но все это письменно. Разговорный вам может понадобиться, если клиент будет часто по скайпу вам названивать. Его освоить в разы сложнее. Поэтому можете честно заявлять клиенту, что уровень пока у вас не позволяет вести разговор. А там все от клиента будет зависеть.
    Ответ написан
  • Как сделать такой же наложенный цвет на картинку?

    loly_girl
    @loly_girl
    Верстальщица, дизайнер, ретушёр
    Режим наложения градиента — цвет, оттенок, оверлей и так далее по вкусу.
    Ответ написан
  • Как интегрировать проводник windows в свое приложение?

    @ATauenis
    Вставьте WebBrowser (IE), или как оно там в Delphi, и загрузите в него URL папки. Если хотите проводник полностью (с интерфейсом), то только смотреть на MSDN. И то, не факт, что описано. WebBrowser выведет только список файлов, контекстные меню у файлов и у пустого места будут, переключение видов осуществляется через КМ пустого места.
    Ответ написан
  • Как интегрировать проводник windows в свое приложение?

    svd71
    @svd71
    Можно. Нужно смотреть COM-интрфейсы. Внятного примера с ходу не нашел, но вот примерное построение шелловского поиска www.delphi-central.com/tutorials/Shell_Search.aspx .

    Как прийдет понимание об использовании интерфейсов, COM и ActiveX, советую сразу посмотреть на msdn.com - там все интерфейсы должны быть расписаны.
    Ответ написан
  • Написать приложение для iPhone с нуля?

    nochkin
    @nochkin
    Если приложение достаточно простое, то можно его написать на html5/css/js и завернуть в приложение с помощью PhoneGap.
    На html5 порог входа намного ниже.
    Из недостатков — на html5 мибильные приложения обычно медленнее. Но для «приложение для покупок» скорость может быть не так будет чувствоваться, а время разработки сильно уменьшится.
    Ответ написан
  • Видео-проигрыватель на 2 монитора

    AquaXP
    @AquaXP
    При должной настройке, BSPlayer(www.bsplayer.org) реализует необходимый функционал.
    Ответ написан