GLSL — переменная получает мусорное значение — GL_POINTS

Странная проблема. Похоже, моя программа GLSL ведет себя иначе, чем логика и спецификация. Вот верт-шейдер:

#version 120

uniform mat4 q;
varying vec2 TextureCoord;

void main()
{
  gl_FrontColor = gl_Color;
  gl_TexCoord[0] = gl_MultiTexCoord0;
  vec4 p = q*gl_Vertex;
  TextureCoord = vec2(.01f,.01f);
  gl_Position= gl_ModelViewProjectionMatrix*p;
  gl_PointSize = gl_Normal.x / -p.z;
}

А вот и фраг-шейдер:

#version 120

uniform sampler2D theTex;
varying vec2 TextureCoord;

void main()
{
  vec2 realTexCoord = ( gl_TexCoord[0].st*vec2(0.024f,0.024f)) + TextureCoord;
  gl_FragColor = gl_Color*texture2D(theTex, realTexCoord);

}

Морщина вот в чем. Если я удалю + TextureCoord во фраг-шейдере и заменю его какой-нибудь константой vec2, например (.1f,.1f), все в порядке, я вижу текстуру. Но вот так я просто получаю странный мусорный цветной шум. Это GL_POINTS с включенными точками сглаживания и заменой текстурных координат. Я использую TexCoord[0].st, потому что gl_PointCoord всегда равен нулю...

Похоже, что происходит то, что ненужные значения каким-то образом попадают в мои промежуточные значения. Но как это произойдет? И если эти значения каким-то образом «интерполируются» между вершинным и фрагментным шейдерами, какая логика применяется?

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

Я использую LWJGL.


person Community    schedule 29.06.2012    source источник
comment
Вы на самом деле проверяете ссылку на шейдер и компилируете ошибки в информационном журнале? Я не думал, что использование gl_TexCoord во фрагментном шейдере является законным.   -  person Tim    schedule 30.06.2012
comment
да, я. Это хорошо, но для этого искажения. Я использую более старое оборудование, но все же...   -  person    schedule 30.06.2012


Ответы (2)


Что такое GPU HW? Вы пробовали установить для него последние версии драйверов? Вы пробовали запускать свой код на графическом процессоре от другого поставщика? Это может быть в том случае, когда вариации неправильно связаны между шейдерами - это может произойти в некоторых старых реализациях OpenGL с ошибками.

Вы пробовали то же самое с GL_TRIANGLE_STRIP? Здесь может быть только ошибка топологии GL_POINTS. Кстати. текстурирование GL_POINTS для меня странная идея.

Вариации интерполируются через примитивы в соответствии с текущим значением gl_Position. Для GL_POINTS не должно быть интерполяции, так как на собранный примитив приходится одна вершина.

person sacygan    schedule 30.06.2012
comment
Когда вы хотите генерировать частицы, особенно когда что-то ломается, например, дерево, камень или даже плоть, вам нужно генерировать текстурированные частицы на основе текстуры ломаемой вещи. Вы также можете использовать это как ярлык для создания дыма, огня и т. д. - person ; 30.06.2012

У меня только что были похожие проблемы со старой картой ATI.

Вы можете попробовать вызвать glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); в своей основной программе - это исправит gl_PointCoord для меня.

Я не уверен, что это сработает для вас (я не знаю, почему это сработало для меня...), но моя проблема с различными искажениями была решена путем добавления строки _coord = gl_TexCoord[0].xy; в конец моего фрагментного шейдера (_coord — это иначе неиспользуемый vec2, и я больше нигде не вызывал gl_TexCoord). Я нашел это предложено на форуме, но для жизни я не могу найти его снова!

person user1483596    schedule 03.10.2012
comment
Я попробую, когда у меня будет шанс. - person ; 03.10.2012