OpenGL纹理下的球体世界

一.先看看整体效果

球体下的世界

二.绘制流程

                在OpenGl综合案例(地板,大小球,公转,自转,移动)文章中,我们绘制了大小球,公转,自转,今天我们往上面添加纹理(图片)

1.镜面效果

                镜面效果其实就是把上面的翻转过来,通过纹理颜色混合达到的效果,具体流程如下:


RenderScene流程

特别说明:纹理调整着色器

                                                 纹理调整着色器(将一个基本色乘以一个取自纹理的单元nTextureUnit的纹理)

                                                 参数1:GLT_SHADER_TEXTURE_MODULATE

                                                 参数2:模型视图投影矩阵

                                                 参数3:颜色

                                                 参数4:纹理单元(第0层的纹理单元)

    shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE,transformPipeline.GetModelViewProjectionMatrix(),vFloorColor, 0);

封装函数绘制流程

LoadTGATexture封装函数即参数说明:

boolLoadTGATexture(constchar*szFileName,GLenumminFilter,GLenummagFilter,GLenumwrapMode)

{

    GLbyte*pBits;

    intnWidth, nHeight, nComponents;

    GLenumeFormat;

    //1.读取纹理数据

    pBits =gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);

    if(pBits ==NULL)

        return false;

    //2、设置纹理参数

    //参数1:纹理维度

    //参数2:为S/T坐标设置模式

    //参数3:wrapMode,环绕模式

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);

    //参数1:纹理维度

    //参数2:线性过滤

    //参数3:wrapMode,环绕模式

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);

    //3.载入纹理

    //参数1:纹理维度

    //参数2:mip贴图层次

    //参数3:纹理单元存储的颜色成分(从读取像素图是获得)-将内部参数nComponents改为了通用压缩纹理格式GL_COMPRESSED_RGB

    //参数4:加载纹理宽

    //参数5:加载纹理高

    //参数6:加载纹理的深度

    //参数7:像素数据的数据类型(GL_UNSIGNED_BYTE,每个颜色分量都是一个8位无符号整数)

    //参数8:指向纹理图像数据的指针

    glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB, nWidth, nHeight, 0,

                 eFormat,GL_UNSIGNED_BYTE, pBits);

    //使用完毕释放pBits

    free(pBits);

    //只有minFilter 等于以下四种模式,才可以生成Mip贴图

    //GL_NEAREST_MIPMAP_NEAREST具有非常好的性能,并且闪烁现象非常弱

    //GL_LINEAR_MIPMAP_NEAREST常常用于对游戏进行加速,它使用了高质量的线性过滤器

    //GL_LINEAR_MIPMAP_LINEAR 和GL_NEAREST_MIPMAP_LINEAR 过滤器在Mip层之间执行了一些额外的插值,以消除他们之间的过滤痕迹。

    //GL_LINEAR_MIPMAP_LINEAR 三线性Mip贴图。纹理过滤的黄金准则,具有最高的精度。

    if(minFilter == GL_LINEAR_MIPMAP_LINEAR ||

       minFilter ==GL_LINEAR_MIPMAP_NEAREST ||

       minFilter ==GL_NEAREST_MIPMAP_LINEAR ||

       minFilter ==GL_NEAREST_MIPMAP_NEAREST)

    //4.加载Mip,纹理生成所有的Mip层

    //参数:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D

    glGenerateMipmap(GL_TEXTURE_2D);

    return true;

}

自定义函数说明:

void drawSomething(GLfloat yRot)

{

    //1.定义光源位置&漫反射颜色

    staticGLfloatvWhite[] = {1.0f,1.0f,1.0f,1.0f};

    staticGLfloatvLightPos[] = {0.0f,3.0f,0.0f,1.0f};


    //2.绘制悬浮小球球

    glBindTexture(GL_TEXTURE_2D, uiTextures[2]);

    for(inti =0; i

        modelViewMatrix.PushMatrix();

        modelViewMatrix.MultMatrix(spheres[i]);

        shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,

                                     modelViewMatrix.GetMatrix(),

                                     transformPipeline.GetProjectionMatrix(),

                                     vLightPos,

                                     vWhite,

                                     0);

        sphereBatch.Draw();

        modelViewMatrix.PopMatrix();

    }


    //3.绘制大球球

    modelViewMatrix.Translate(0.0f, 0.2f, -2.5f);

    modelViewMatrix.PushMatrix();

    modelViewMatrix.Rotate(yRot, 0.0f, 1.0f, 0.0f);

    glBindTexture(GL_TEXTURE_2D, uiTextures[1]);

    shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,

                                 modelViewMatrix.GetMatrix(),

                                 transformPipeline.GetProjectionMatrix(),

                                 vLightPos,

                                 vWhite,

                                 0);

    torusBatch.Draw();

    modelViewMatrix.PopMatrix();


    //4.绘制公转小球球(公转自转)

    modelViewMatrix.PushMatrix();

    modelViewMatrix.Rotate(yRot * -2.0f,0.0f,1.0f,0.0f);

    modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);

    glBindTexture(GL_TEXTURE_2D, uiTextures[2]);

    shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,

                                 modelViewMatrix.GetMatrix(),

                                 transformPipeline.GetProjectionMatrix(),

                                 vLightPos,

                                 vWhite,

                                 0);

    sphereBatch.Draw();

    modelViewMatrix.PopMatrix();

}

                最后附上压栈出栈理解:(仅限个人理解)modelViewMatrix.PushMatrix()&&modelViewMatrix.PopMatrix()成对出现,在观察者看到的世界中,使用OpenGL绘制图形,它是一个绘制完成后再绘制另外一个,压栈和出栈可以理解成告诉OpenGL在对应的这个区间,使用其设置的参数绘制图形,最外层的压栈出栈就是告诉OpenGL,绘制其他所有的图形都必须在这个压栈出栈区间(你可以理解成当我们没有睁开眼睛时,看不见任何物体,当我们睁开眼的时候,说看到的物体在这个区间绘制)


push/pop理解

绑定纹理理解:

绑定纹理总结

说明:(仅限个人理解)SetupRC只是初始化我们的纹理,在RenderScene告诉shaderManager每一个图形要用的对应的纹理,删除了SetupRC的绑定,则不能显示纹理,删除了RenderScene的绑定,则拿到的是上一个或者不确定的纹理

附上案例:链接: https://pan.baidu.com/s/1uSR6ltwqlXRegBJXJbQfzg 提取码: bka4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342