Up. Что скажете насчёт предложения из поста выше?
I
A)
Теперь о насущном. Steps3D, прошу вас разобраться с тем, что шейдеры из исходного кода НЕ соответствуют шейдерам из статьи. Это очень мешает. Тут надо также сказать о парадоксальной вещи в файлах ex1-p1.
Steps3D написал(а):А ее надо нормализовывать - она пришла в фрагментный шейдер как varying, т.е. является результатом билинейной интерполяции значения из вершинного шедера.А при билинейной интерполяции единичных векторов в общем случае получаются неединичные вектора.
И после этого я вижу в исходном коде, что вы испольузете как раз тот способ, который признали неправильным. Это парадокс!
Вот что написано:
varying vec3 pos;
varying vec3 n;
void main (void)
{
vec3 n2 = normalize ( n );
gl_FragData [0] = vec4 ( pos.xyz, gl_FragCoord.z*gl_FragCoord.w );
gl_FragData [1] = vec4 ( 0.5*n + vec3(0.5), 1.0 );
}
varying vec3 pos;
varying vec3 n;
void main(void)
{
pos = vec3 ( gl_ModelViewMatrix * gl_Vertex );
n = normalize ( gl_NormalMatrix *gl_Normal );
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
//Тут ещё одна ошибка, текстур у нас нет, а текстурные координаты мы зачем-то рассчитываем:
gl_TexCoord [0] = gl_MultiTexCoord0;
}
B)
Так же заметил надувательство. Есть в статье "Рис. 1". Перед ним расположены шейдеры первого прохода из этого следует, что рисунок иллюстрирует работу этих шейдеров первого прохода, что является неправдой. Для получения этого рисунка было задействовано сразу 4 шейдера, а не 2. Надо бы привести ещё 2 недостающих шейдера.
C)
В исходном коде первого примера есть строки:
decalMap = createTexture2D ( true, "../../Textures/oak.bmp" );
stoneMap = createTexture2D ( true, "../../Textures/block.bmp" );
teapotMap = createTexture2D ( true, "../../Textures/Oxidated.jpg" );
...
program1.bind ();
program1.setTexture ( "diffMap", 0 );
program1.unbind ();
program2.bind ();
program2.setTexture ( "posMap", 0 );
program2.setTexture ( "normalMap", 1 );
program2.setTexture ( "depthMap", 2 );
program2.unbind ();
В этом примере не используются текстуры! Вы их загружаете и передаёте по ошибке!
II
У меня есть ещё парочка простых вопросов по исходному коду. Я программист Delphi, и C++ для меня не понятен. Прошу ответить, что такое:
if ( (format = fpRgbaFormatWithPrecision ( 32 ) ) == 0 )
{
printf ( "Floating-point textures not supported !\n" );
return 1;
}
И что означает конкретно fpRgbaFormatWithPrecision.
Скажите также, зачем в первом примере вы сделали переменную "format" глобальной (а используете только в main)?
Также. Есть фрагмент кода:
if ( !buffer.attachColorTexture ( GL_TEXTURE_RECTANGLE_ARB, screenMapAdd, 1 ) )
printf ( "buffer error with color attachment\n");
//...
bool FrameBuffer :: attachColorTexture ( GLenum target, unsigned texId, int no )
{
if ( frameBuffer == 0 )
return false;
if ( target != GL_TEXTURE_2D && target != GL_TEXTURE_RECTANGLE_ARB && (target < GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB || target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) )
return false;
glBindTexture ( target, colorBuffer [no] = texId );
glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + no, target, texId, 0 );
return true;
}
Меня интрересует, что означает GL_COLOR_ATTACHMENT0_EXT + no, как это вообще понимет компилятор? Типо GL_COLOR_ATTACHMENT0_EXT + GL_COLOR_ATTACHMENT1_EXT? Разве так можно?
Отредактировано DungeonLords (2010-08-05 15:16:21)