将矩形纹理映射到球体上

我想将矩形地球纹理映射到球体上。我可以加载“globe.jpg”纹理并将其显示在屏幕上。我想我需要在特定纹理坐标处检索“globe.jpg”纹理的颜色,并使用它来为地球上的特定点着色。

我想将右中侧的地球地图映射到左侧的球体之一上(见图)

http://img2.mukewang.com/60e903cb000126e610180544.jpg

加载纹理的代码:


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)。

我想我现在可以在我加载的纹理上使用这个 u 和 v 坐标来找到那里纹理的颜色。但我不知道怎么做。我也认为北极和赤道矢量不正确。


慕容708150
浏览 213回答 1
1回答

临摹微笑

我不知道 4 个月后您是否还需要答案,但是:如果您有一个正确的球体模型(如使用 Blender 创建的 obj 文件)和正确的 uv 信息,您只需要导入该模型(使用 assimp 或任何其他导入器)并在渲染过程中应用纹理。你的问题有点含糊,因为我不知道你是否使用着色器。我的方法是:1:使用assimp库或任何其他导入库导入模型2:实现顶点和片段着色器,并在片段着色器中为纹理包含一个sampler2Duniform3:在渲染过程中选择你的着色器程序 id [ GL.UseProgram(...) ] 然后将顶点和纹理 uv 和纹理像素(作为统一)信息上传到着色器。4:使用标准的顶点着色器,如下所示:#version 330in      vec3 aPosition;in      vec2 aTexture;out     vec2 vTexture;uniform mat4 uModelViewProjectionMatrix;void main(){    vTexture = aTexture;    gl_Position = uModelViewProjectionMatrix * vec4(aPosition, 1.0); }5:使用标准片段着色器,如下所示:#version 330in      vec2 vTexture;uniform sampler2D uTexture;out vec4 fragcolor;void main(){    fragcolor = texture(uTexture, vTexture);}如果您需要具有矩形 uv 映射的球体的有效 obj 文件,请随意删除一行(或两行)。
打开App,查看更多内容
随时随地看视频慕课网APP