Страница 1 из 1

Как вычислить волшебное число?

СообщениеДобавлено: 17 авг 2017, 03:34
Albeoris
Не уверен - сюда или в кузню, если ошибся разделом, прошу прощения.

Есть вершинный шейдер:

Скрытый текст:
Синтаксис:
  1. Shader "PSX/FieldMapActor" { 
  2.     Properties {  
  3.         _MainTex ("Texture", 2D) = "grey" { }  
  4.         _Color ("Tint", Color) = (1,1,1,1)  
  5.         _Slice ("Slice", Float) = 40960  
  6.     }  
  7.     SubShader {  
  8.         Tags { "QUEUE"="Transparent+1" "IGNOREPROJECTOR"="true" "RenderType"="Transparent+1" }  
  9.         Pass {  
  10.             Tags { "QUEUE"="Transparent+1" "IGNOREPROJECTOR"="true" "RenderType"="Transparent+1" }  
  11.             Blend One OneMinusSrcAlpha  
  12.             GpuProgramID 65460  
  13.             Program "vp" {  
  14.                 SubProgram "d3d9 " {  
  15.                     Bind "vertex" Vertex 
  16.                     Bind "color" Color  
  17.                     Bind "texcoord" TexCoord0  
  18.                     Matrix 4 [_MatrixRT]  
  19.                     Matrix 0 [_Object2World]  
  20.                     Matrix 8 [unity_MatrixVP] 3  
  21.                     Float 16 [_CharZ]  
  22.                     Vector 11 [_Color]  
  23.                     Float 15 [_DepthOffset]  
  24.                     Float 13 [_OffsetX]  
  25.                     Float 14 [_OffsetY]  
  26.                     Float 12 [_ViewDistance]  
  27.                     "vs_2_0  
  28.                         def c17, 0, -112, -1, 0.25  
  29.                         def c18, 0.00625000009, 0.00892857183, 0, 0  
  30.                         dcl_position v0  
  31.                         dcl_color v1  
  32.                         dcl_texcoord v2  
  33.                         mov r0.yw, c17.xxzz  
  34.                         dp4 r1.x, c1, v0  
  35.                         mov r1.y, -r1.x  
  36.                         dp4 r1.z, c2, v0  
  37.                         dp4 r1.x, c0, v0  
  38.                         dp4 r1.w, c3, v0  
  39.                         dp4 r2.x, c6, r1  
  40.                         rcp r2.y, r2.x  
  41.                         mul r2.y, r2.y, c12.x  
  42.                         dp4 r2.z, c5, r1  
  43.                         mul r2.w, r2.y, r2.z  
  44.                         mad r2.z, r2.z, r2.y, c17.y  
  45.                         mov r0.x, -r2.w  
  46.                         add r0.z, r2.w, r2.z  
  47.                         slt r2.z, r2.x, c17.x  
  48.                         mov r2.w, c17.w  
  49.                         mad r2.x, r2.x, r2.w, c15.x  
  50.                         add r3.z, r2.x, c16.x  
  51.                         mad r3.xy, r2.z, r0.wzzw, r0.yxzw  
  52.                         mov oT1.z, r3.x  
  53.                         dp4 r0.x, c4, r1  
  54.                         dp4 r3.w, c7, r1  
  55.                         mov oT1.xyw, r1  
  56.                         mul r3.x, r2.y, r0.x  
  57.                         dp4 oPos.z, c10, r3  
  58.                         dp4 r0.x, c8, r3  
  59.                         dp4 r0.y, c9, r3  
  60.                         mov r1.xy, c18  
  61.                         mad oPos.y, c14.x, r1.y, r0.y  
  62.                         mad oPos.x, c13.x, r1.x, r0.x  
  63.                         mul oD0, v1, c11  
  64.                         mov oPos.w, -c17.z  
  65.                         mov oT0.xy, v2  
  66.                      
  67.                     "  
  68.                 }  
  69.             }  
  70.             Program "fp" {  
  71.                 SubProgram "d3d9 " {  
  72.                     Float 0 [_Slice]  
  73.                     SetTexture 0 [_MainTex] 2D 0  
  74.                     "ps_2_0  
  75.                         def c1, -0.5, 0, 0, 0  
  76.                         dcl v0  
  77.                         dcl t0.xy  
  78.                         dcl t1.xyz  
  79.                         dcl_2d s0  
  80.                         texld_pp r0, t0, s0  
  81.                         mov r1, t1.z  
  82.                         add r2, -t1.y, c0.x  
  83.                         mad r3, r0.w, v0.w, c1.x  
  84.                         texkill r1  
  85.                         texkill r2  
  86.                         texkill r3  
  87.                         mul_pp r0, r0, v0  
  88.                         mul_pp r1.xyz, r0.w, r0  
  89.                         add_pp r0.xyz, r1, r1  
  90.                         mov_pp oC0, r0  
  91.                      
  92.                     "  
  93.                 }  
  94.             }  
  95.         }  
  96.     }  


Изменение разрешения экрана, аспекта и области отображения с 4:2.8 на 16:9 приводит к нежелательномусмещению объектов на сцене.
Их положение можно откорректировать изменением переменной _OffsetX или же магическим числом 0.00625000009.
Экспериментальным путём выяснил, что замена последнего на 0.005 даёт желаемый результат.
Пожалуйста - поясните, что это может быть за число и на основе чего его можно высчитать, чтобы передать параметром в шейдер?

Re: Как вычислить волшебное число?

СообщениеДобавлено: 18 авг 2017, 07:47
jetyb
Да, только хардкор. [nuklear]
Это не шейдер, а сгенерированный компилятором код. Никто не будет с таким разбираться.

Вы путаете форум с сообществом наемных киберманьяков.

Re: Как вычислить волшебное число?

СообщениеДобавлено: 18 авг 2017, 10:15
Albeoris
Какова цель данного сообщения?
Почему говоришь за других?
Почему уверен, что среди форумчан нет киберманьяков?
Почему уверен, что никто не может прочитать 38 строчек?
Почему уверен, что их вообще нужно читать, чтобы ответить на вопрос - что может означать это число?

Я вот, как человек бесконечно далёкий от шейдеров, посмотрел где используется это число:
Синтаксис:
  1. def c18, 0.00625000009, 0.00892857183, 0, 0  
  2. mov r1.xy, c18  
  3. mad oPos.y, c14.x, r1.y, r0.y  
  4. mad oPos.x, c13.x, r1.x, r0.x  


Открыл гугл, прочитал, что делает mad. Оказалось, что умножает, а затем складывает значения переданных регистров:
Синтаксис:
  1. dest.x = src0.x * src1.x + src2.x; 


Синтаксис:
  1. oPos.y = c14.x * 0.00892857183 + r0.y 
  2. oPos.x = c13.x * 0.00625000009 + r0.x 


Подумал - а что если разделить 1 на эти коэффициенты - раз уж на них умножают:
Синтаксис:
  1. 1 / 0.00892857183 = 111.99999496448022639696902119227 ~= 112 
  2. 1 / 0.00625000009 = 159.99999769600003317759952224257 ~= 160 


Родное разрешение игры - 320 x 224
Половина от этого - 160 x 112

Тайна магических чисел раскрыта. Всем спасибо, все свободны.
Никаких специальных знаний не требуется, быть безумным киберманьяком тоже.
Почему ты считаешь, что форумчане не способны минутку подумать над вопросом, выходящим за рамки привычных задач?

Re: Как вычислить волшебное число?

СообщениеДобавлено: 18 авг 2017, 14:57
jetyb
Потому что тут надо не думать, а реально трахать мозги с этими цифрами, угадывая их смысл.
И ради кого? Ради человека, не уважающего помогающих людей, ленящегося представить шейдер в удобоваримом виде, ленящегося даже написать все данные о вопросе.
А, еще форумчане должны быть телепатами, ибо на вопрос невозможно ответить не зная всего говнокода в проекте.

Re: Как вычислить волшебное число?

СообщениеДобавлено: 19 авг 2017, 11:49
Albeoris
Потому что тут надо не думать, а реально трахать мозги с этими цифрами, угадывая их смысл.

Я вот просто подумал. И ход рассуждений указан выше. Никакой магии и угадываний.

И ради кого? Ради человека, не уважающего помогающих людей

Прежде всего ради себя. Чтобы проверить собственные знания и поразмыслить над нестандартной задачей.
Уважение нужно заслужить. А пока я могу быть либо благодарен за помощь, либо нет.
Ты вот мне помог с другим вопросом, за что тебе большое спасибо. Тем страньше видеть от тебя столь бесполезный ответ.
Не знаешь, лень, не хочешь помогать - ну так пройди мимо, зачем говорить за других и додумывать за собеседника, что он считает и кого уважает.

ленящегося представить шейдер в удобоваримом виде, ленящегося даже написать все данные о вопросе.

Все данные о вопросе указаны. Максимально подробно. Полный текст шейдера, вся информация об окружении, включая оригинальный аспект.
Если бы у меня был шейдер в удобоваримом виде, я бы его представил. Имеем то, что имеем.

А, еще форумчане должны быть телепатами, ибо на вопрос невозможно ответить не зная всего говнокода в проекте.

Я же ответил, и описал ход рассуждений. Никаких иных знаний не потребовалось.

Фактически, всё было до смешного просто, так как достаточно было разделить одну цифру на другую:
0.00892857183 / 0.00625000009 = 1.4285714

И сравнить с аспектом:
4 / 2.8 = 1.4285714

Даже в инструкциях шейдера разбираться не нужно.
Единственной проблемой (для меня) было отсутствие структурированного изложения проблемы. И стоило правильно и последовательно описать проблему на форуме, как решение стало простым и очевидным.

Так что извини, но твои сообщения в данной теме не несут смысловой нагрузки, а обвинения беспочвенны.
Но за помощь с областью просмотра всё равно спасибо. :-bd

Re: Как вычислить волшебное число?

СообщениеДобавлено: 19 авг 2017, 17:33
Woolf
И стоило правильно и последовательно описать проблему на форуме, как решение стало простым и очевидным.

У меня тоже так часто бывает )