Отображение прямоугольной текстуры на сферу - PullRequest
0 голосов
/ 29 мая 2018

Я хочу наложить прямоугольную текстуру глобуса на сферу.Я могу загрузить текстуру «globe.jpg» и отобразить ее на экране.Я думаю, что мне нужно получить цвет текстуры "globe.jpg" по определенным координатам текстуры и использовать его для раскраски определенной точки на глобусе.

Я хочу отобразить карту глобуса на правой стороне среднего наодна из сфер слева (см. рисунок)

enter image description here

Код для загрузки текстуры:

int texture;

public Texture() {
   texture = LoadTexture("Content/globe.jpg");
}

public int LoadTexture(string file) {
        Bitmap bitmap = new Bitmap(file);

        int tex;
        GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);

        GL.GenTextures(1, out tex);
        GL.BindTexture(TextureTarget.Texture2D, tex);

        BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
            OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
        bitmap.UnlockBits(data);


        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
        GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
        //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
        //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);

        return tex;
    }

Я тоже ужеЯ думаю, что создал некоторый код, который отображает точку на сфере в точку на точке текстуры (используется код из раздела сфер отображения текстуры в https://www.cs.unc.edu/~rademach/xroads-RT/RTarticle.html).

point, где Vector3 гделуч пересекает сферу:

        vn = new Vector3(0f, 1f, 0f); //should be north pole of sphere, but it isn't based on sphere's position, so I think it's incorrect
        ve = new Vector3(1f, 0f, 0f); // should be a point on the equator

        float phi = (float) Math.Acos(-1 * Vector3.Dot(vn, point));
        float theta = (float) (Math.Acos(Vector3.Dot(point, ve) / Math.Sin(phi))) / (2 * (float) Math.PI);

        float v = phi / (float) Math.PI;

        float u = Vector3.Dot(Vector3.Cross(vn, ve), point) > 0 ? theta : 1 - theta;

Я думаю, что теперь я могу использовать эту координату u и v для загруженной текстуры, чтобы найти цвет текстуры там. Но я не знаю как.также подумайте, что векторы северного полюса и экватора неверны.

1 Ответ

0 голосов
/ 05 октября 2018

Я не знаю, нужен ли вам ответ через 4 месяца, но:

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

Ваш вопрос немного расплывчатый, потому что я не знаю, используете ли вы шейдеры.

Мой подход был бы следующим:

1: Импортировать модель с помощью библиотеки assimp или любой другой библиотеки импорта.

2: Реализовать вершинные и фрагментные шейдеры и включить униформу sampler2D для текстуры.в фрагментном шейдере

3: во время прохождения рендеринга выберите идентификатор вашей шейдерной программы [GL.UseProgram (...)], а затем загрузите вершины и информацию об ультрафиолетовых и текстурных пикселях (как единообразных) в шейдеры.

4: Используйте стандартный вершинный шейдер, как это:

#version 330

in      vec3 aPosition;
in      vec2 aTexture;
out     vec2 vTexture;
uniform mat4 uModelViewProjectionMatrix;

void main()
{
    vTexture = aTexture;
    gl_Position = uModelViewProjectionMatrix * vec4(aPosition, 1.0); 
}

5: Используйте стандартный фрагментный шейдер, как это:

#version 330

in      vec2 vTexture;
uniform sampler2D uTexture;
out vec4 fragcolor;

void main()
{
    fragcolor = texture(uTexture, vTexture);
}

Если вам нужен правильный объектфайл для сферы с прямоугольным ультрафиолетовым отображением, не стесняйтесь опустить линию (или две).

...