Войти
ПрограммированиеФорумГрафика

Артефакты в шейдере[скриншоты, код, демка] (3 стр)

Страницы: 1 2 3
#30
20:17, 27 апр. 2014

Заспамил все интернеты:
https://www.opengl.org/discussion_boards/showthread.php/184080-Sq… 1#post1259141
http://stackoverflow.com/questions/23323667/glsl-nvidia-square-ar… s-shader-demo
https://devtalk.nvidia.com/default/topic/736436/opengl/glsl-squar… shader-demo-/
Жду, когда кто-нибудь ответит.

Panzerschrek[CN]
> По скриншотам видно, что вычисления в группе потоков всегда идёт по одной ветке
> ( те самые квадратики ). Советую вообще избавится от ветвлений, что в данном
> примере не сложно.
лол, интересно, как можно избавиться от ветвлений при сортировке? как я уже сказал в нульпосте, код шейдера предельно упрощён и, очевидно, в исходном варианте сортировка играет принципиальную роль.

#31
21:19, 27 апр. 2014

Suslik
> return;
> ColoredIntersection tmp = ints[j];
> ints[j] = ints[i];
> ints[i] = tmp;
а зачем кстати после return еще какой-то код? компилятор конечно уберет это.

#32
21:54, 27 апр. 2014

Andrey
return тестовый, чтобы показать, что это условие никогда не выполняется. если бы условие выполнилось, вернулся бы красный цвет. тем не менее, если его удалить, то артефакты пропадают.

#33
23:17, 27 апр. 2014

Suslik
> тем не менее, если его удалить, то артефакты пропадают.
Вот это интересно! Intel/Amd этот код выбрасывают, получается nVidia на этом имеет баг.

#34
0:01, 28 апр. 2014

GTX 670, 332.21 - артефакты
пропадают, даже если в условие явно добавить && false:

  if(ints[i].geomInt.point.z < ints[i].geomInt.point.z - 10.0 && false)

Любая манипуляция со структурой Intersection (изменения порядка параметров, перенос цвета из Colored<...> ) - убирает артефакт, похоже на баг компилятора. Что интересмно, темы по адресу https://devtalk.nvidia.com/default/topic/736436/opengl/glsl-squar… shader-demo-/ я не нашел, ее удалили? Модераторы что-то сказали перед тем, как ее удалять? Не очень-то дружественно.

#35
1:07, 28 апр. 2014

XperienS
> Что интересмно, темы по адресу
> https://devtalk.nvidia.com/default/topic/736436/opengl/glsl-squar…
> shader-demo-/ я не нашел, ее удалили?
кто-то мне объяснит, какого чёрта у них происходит на форуме? почему 90% тем - спам про быстрые методы похудения, у оставшихся 9% - 0 ответов, а мою тему видно только залогинившись из-под меня?

Изображение
Изображение

Быть может, действительно, баг в том, что НВидия - единственная, кто не выбрасывает условие, которое никогда не выполянется, поэтому и артефакты? Хотя с другой стороны, ну и что, что не отбрасывает, оно ж всё равно не выполняется?

#36
5:34, 28 апр. 2014

GTX 560 - глюкает.
nvlddmkm 9.18.13.567 (ForceWare 305.67) / Win7 64

Короче, замени bool на инт, и будет щасте :)

struct Intersection
{    
  vec3 point;
  vec3 norm;
  int valid;
};

Похожая АТИ тема:
http://www.gamedev.ru/code/forum/?id=183159

#37
8:29, 28 апр. 2014

Да, кстати.
Насколько я помню, видяхи не тянут 1 байтовые типы данных(bool, char), и они эмулируются через другие.
Возможно, в этом и есть проблема.

int должен помочь

#38
11:14, 28 апр. 2014

Suslik
> Например, если строку:
> if(ints[i].geomInt.valid) //1
> заменить на
> if(ints[i].geomInt.valid == true) //1
> то картинка становится нормальной

У меня похожее когда-то было.

Не работало:

while (z < sin(..))

Работало:

f = sin(..);
while (z < f)

Сделал демку и с исходниками закинул им на сайт. В след дровах починили. В теме ответов не было.

#39
11:23, 28 апр. 2014

Suslik
> кто-то мне объяснит, какого чёрта у них происходит на форуме? почему 90% тем -
> спам про быстрые методы похудения, у оставшихся 9% - 0 ответов, а мою тему
> видно только залогинившись из-под меня?
Судя по скриншотам темы про похудение видны зарегистрированным пользователям, а гости видят только темы прошедшие премодерацию.

#40
12:39, 28 апр. 2014

Suslik
Поправил шейдер как советовали

//
int PointProjectionInsideTriangle(vec3 p1, vec3 p2, vec3 p3, vec3 point)
{
  vec3 n = cross((p2 - p1), (p3 - p1));

  vec3 n1 = cross((p2 - p1), n);
  vec3 n2 = cross((p3 - p2), n);
  vec3 n3 = cross((p1 - p3), n);

  float proj1 = dot((point - p2), n1);
  float proj2 = dot((point - p3), n2);
  float proj3 = dot((point - p1), n3);

  if(proj1 > 0.0)
    return 0;
  if(proj2 > 0.0)
    return 0;
  if(proj3 > 0.0)
    return 0;
  return 1;
}

struct Intersection
{
  vec3 point;
  vec3 norm;
  int valid;
};

Intersection GetRayTriangleIntersection(vec3 rayPoint, vec3 rayDir, vec3 p1, vec3 p2, vec3 p3)
{
  vec3 norm = normalize(cross(p1 - p2, p1 - p3));

  Intersection res;
  res.norm = norm;
  res.point = vec3(rayPoint.xy, 0.0);
  res.valid = PointProjectionInsideTriangle(p1, p2, p3, res.point);
  return res;
}

struct ColoredIntersection
{
  Intersection geomInt;
  vec4 color;
};

#define raysCount 15
void main(void)
{
  vec2 radius = (gl_FragCoord.xy / vec2(800.0, 600.0)) - vec2(0.5, 0.5);
  
  ColoredIntersection ints[raysCount];

  vec3 randomPoints[raysCount];
  int i, j;


  for(int i = 0; i < raysCount; i++)
  {
    float theta = 0.5 * float(i);
    float phi = 3.1415 / 2.0;
    float r = 1.0;
    randomPoints[i] = vec3(r * sin(phi) * cos(theta),  r * sin(phi)*sin(theta), r * cos(phi));

    vec3 tangent = normalize(cross(vec3(0.0, 0.0, 1.0), randomPoints[i]));
    vec3 trianglePoint1 = randomPoints[i] * 2.0 + tangent * 0.2;
    vec3 trianglePoint2 = randomPoints[i] * 2.0 - tangent * 0.2;

    ints[i].geomInt = GetRayTriangleIntersection(vec3(radius, -10.0), vec3(0.0, 0.0, 1.0), vec3(0.0, 0.0, 0.0), trianglePoint1, trianglePoint2);
    if(1 == ints[i].geomInt.valid)
    {
      float c = length(ints[i].geomInt.point);
      ints[i].color = vec4(c, c, c, 1.0);
    }
  }
  
  for(i = 0; i < raysCount; i++)
  {
    for(j = i + 1; j < raysCount; j++)
    {
      if(ints[i].geomInt.point.z < ints[i].geomInt.point.z - 10.0)
      {
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
        ColoredIntersection tmp = ints[j];
        ints[j] = ints[i];
        ints[i] = tmp;
      }
    }
  }

  vec4 resultColor = vec4(0.0, 0.0, 0.0, 0.0);
  for(i = 0; i < raysCount + 0; i++)
  {
    if(1 == ints[i].geomInt.valid)
      resultColor += ints[i].color;
  }

  gl_FragColor = clamp(resultColor, 0.0, 1.0);
}
nVidia 210 полет нормальный.
Все таки bool в топку. Но я разочарован в хвалеными распиаренном железе от nVidia. не все  у них хорошо...
Хотелось бы узнать что скажут на форуме. И поправят ли это в дровах.
#41
14:25, 28 апр. 2014

Думаю это баг компилятора просто.
А если поиграться с версией GLSL? Не влияет?

#42
14:30, 28 апр. 2014

Окей, я постараюсь адаптировать код на исходный шейдер. Боюсь, что может оказаться не всё так просто, потому что я уже сталкивался с аналогичным багом и без bool'а.

Страницы: 1 2 3
ПрограммированиеФорумГрафика

Тема в архиве.