Проективное наложение текстур с использованием GLSL через WebGL - PullRequest
2 голосов
/ 07 апреля 2011

Я хочу проецировать текстуру на стену или любой объект.Я изменил шейдеры этого урока следующим образом на основе этого урока проекции текстуры Cg tutorial (ctrl-f "9.3"), но я получил пустой белый холст.Я новичок в шейдерах и не совсем уверен, как отладить это (без ошибок JS), какие-либо советы?

Вершинный шейдер:

uniform mat4 u_modelViewProjMatrix;
uniform mat4 u_normalMatrix;
uniform vec3 lightDir;

attribute vec3 vNormal;
attribute vec4 vTexCoord;
attribute vec4 vPosition;

varying float v_Dot;
varying vec2 v_texCoord;

void main()
{
    gl_Position = u_modelViewProjMatrix * vPosition;
    v_texCoord = vTexCoord.st * vPosition;
    vec4 transNormal = u_normalMatrix * vec4(vNormal, 1);
    v_Dot = max(dot(transNormal.xyz, lightDir), 0.0);
}

Фрагментный шейдер:

uniform sampler2D sampler2d;

varying float v_Dot;
varying vec2 v_texCoord;

void main()
{
    vec4 color = texture2DProj(sampler2d,v_texCoord);
    gl_FragColor = vec4(color.xyz * v_Dot, color.a);
}

1 Ответ

2 голосов
/ 07 апреля 2011

Если в вашем коде есть проблема, я думаю, это странный способ работы с v_texCoord.Вы уверены, что не хотите использовать матрицу вместо vTexCoord?Если оставить это в стороне, вопреки моим ожиданиям, texture2DProj определено в GLSL ES 1.0, и кажется, что в противном случае он синтаксически правильный, с совпадающими различными именами.

Отладка GLSL, когда у вас нет доступного пошагового отладчика, имеет тенденцию квключать вывод промежуточных значений в виде цветов фрагмента.Итак, ваши тесты могут быть:

  1. настроить ваш фрагментный шейдер для вывода постоянного цвета, например ярко-красного.Если ваша геометрия не меняется на ярко-красный, значит, ваша программа неправильно связывается, и вам следует проверить журнал на наличие ошибок компиляции.
  2. Попробуйте установить gl_FragColor в подходяще адаптированной версии v_texCoord.Попробуйте загрузить v_texCoord с разными промежуточными значениями из вершинного шейдера.Посмотрите на вывод, чтобы убедиться, что вы получаете правильные сортировки чисел.
  3. попробуйте текстурирование без проективного шага, чтобы убедиться, что вы загружаете текстуру и правильно устанавливаете соответствующую форму.

Плюс любой другой вариант, который вы можете придумать в том же духе.

...