Отображение текстуры сферы XNA или OpenGL

Я пытаюсь сопоставить полностью нормальную текстуру со сферой.

Я не могу изменить свою текстуру на обернутую, поэтому мне нужно найти какую-то функцию сопоставления.

Это мой код вершинного шейдера:

vec3 north = vec3(0.0, 0.0, 1.0);
vec3 equator = vec3(0.0, 1.0, 0.0);
vec3 northEquatorCross = cross(equator, north);
vec3 vertexRay = normalize(gl_Vertex.xyz);
float phi = acos(vertexRay.z);
float tv = (phi / (PI*tiling));    
float tu = 0.0;
if (vertexRay.z == 1.0 || vertexRay.z == -1.0) {
    tu = 0.5;
} else {
    float ang_hor = acos(max(min(vertexRay.y / sin(phi), 1.0), -1.0));      
    float temp = ang_hor / ((2.0*tiling) * PI);
    tu = (vertexRay.x >= 0.0) ? temp : 1.0 - temp;
} 


texPosition  = vec2(tu, tv);

прямо отсюда: http://blogs.msdn.com/coding4fun/archive/2006/10/31/912562.aspx

Это мой фрагментный шейдер:

color = texture2D(debugTex, texPosition);

Как вы можете видеть на этом снимке экрана: http://img189.imageshack.us/img189/4695/sphereproblem.png, на нем видна трещина в сфере... и это то, что я пытаюсь исправить. (используемая текстура: http://img197.imageshack.us/img197/56/debug.jpg)

Первый комментарий на веб-сайте XNA действительно устраняет проблемы, используя: device.RenderState.Wrap0 = WrapCoordinates.Zero;

Но поскольку я недостаточно понимаю внутреннее устройство XNA, я не могу понять, что это решает в данной конкретной проблеме.

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

Любая информация/решение по этому поводу?


person fabiopedrosa    schedule 02.06.2009    source источник
comment
Я только что понял, что совершал ошибку... Я передавал значения uv, используя различные спецификаторы, так что это действительно интерполировалось.   -  person fabiopedrosa    schedule 02.06.2009


Ответы (2)


Это забавно ! У меня была та же проблема, но она была исправлена, я подозреваю, что есть некоторые проблемы с плавающей запятой... вот мой шейдер, который работает!

uniform float r;
void main(void) {
    float deg1, deg2, rr, sdeg1, sdeg2, cdeg2;
    deg1 = (gl_Vertex.y / " "32" ".0) * 2.0 * 3.1415926;
    deg2 = (gl_Vertex.x / " "32" ".0) * 2.0 * 3.1415926;
    sdeg1 = sin(deg1);
    sdeg2 = sin(deg2);
    cdeg2 = cos(deg2);
    gl_Vertex.y = r*sdeg1;
    rr = r*cos(deg1);
    if(rr < 0.0001) rr = 0.0001;
    gl_Vertex.x = rr*sdeg2;
    gl_Vertex.z = rr*cdeg2;
    vec3 vertexRay = normalize(gl_Vertex.xyz);
    float phi = acos(vertexRay.y);
    float tv = (phi / (3.1415926));
    float sphi = sin(phi);
    float theta = 0.5;
    float temp = vertexRay.z / sphi;
    if(temp > 1.0) temp = 1.0;
    if(temp < -1.0) temp = -1.0;
    theta = acos(temp) / (2.0*3.1415926);
    float tu = 0.0;
    if(deg2 > 3.1415926) tu = theta;
    else tu = 1.0 - theta;
    gl_TexCoord[0].x = tu;
    gl_TexCoord[0].y = tv;
    gl_Position = ftransform();
}
person arcana    schedule 31.05.2011

WrapCoordinates.Zero фактически означает, что текстура свернута горизонтально, а не вертикально с точки зрения текстуры.

person Drew Dormann    schedule 02.06.2009
comment
Ну да. Но что это значит...? мне поменять тебя на v? - person fabiopedrosa; 02.06.2009
comment
Похоже, вы пытаетесь решить то, что называется швом. Можете ли вы добавить изображение конкретного шва, который вы видите? Это помогло бы разобраться с причиной. - person Drew Dormann; 02.06.2009