osg的shader使用過程

2021-09-09 07:29:57 字數 3664 閱讀 7148

方法一(osg):

//建立shader

osg::shader* vshader = new osg::shader(osg::shader::vertex, vertexsource);

osg::shader* gshader = new osg::shader(osg::shader::geometry, geomsource);

osg::shader* fshader = new osg::shader(osg::shader::fragment, fragmentsource);

//關聯shader

osg::program* program = new osg::program;

program->addshader(vshader);

program->addshader(gshader);

program->addshader(fshader);

//新增shader

geom->getorcreatestateset()->setattribute(program);

//設定shader中的uniform變數

geom->getorcreatestateset()->adduniform(new osg::uniform("texture", 0));

方法二(osgearth):

osg::stateset* stateset = getorcreatestateset();

virtualprogram* vp = virtualprogram::getorcreate(stateset);

osg::shader* shader = new osg::shader(osg::shader::vertex, vertexsource);

vp->setshader( name, shader );

乙個opengl建立三角形的例子

#include #include #include #include #include #include "ogldev_util.h"

#include "ogldev_math_3d.h"

gluint vbo;

gluint gscalelocation; // 位置中間變數

const char* pvsfilename = "shader.vs";

const char* pfsfilename = "shader.fs";

static void renderscenecb()

static void initializeglutcallbacks()

static void createvertexbuffer()

static void addshader(gluint shaderprogram, const char* pshadertext, glenum shadertype)

const glchar* p[1];

p[0] = pshadertext;

glint lengths[1];

lengths[0] = strlen(pshadertext);

glshadersource(shaderobj, 1, p, lengths);

glcompileshader(shaderobj);

glint success;

glgetshaderiv(shaderobj, gl_compile_status, &success);

if (!success)

glattachshader(shaderprogram, shaderobj);

}static void compileshaders()

string vs, fs;

if (!readfile(pvsfilename, vs)) ;

if (!readfile(pfsfilename, fs)) ;

addshader(shaderprogram, vs.c_str(), gl_vertex_shader);

addshader(shaderprogram, fs.c_str(), gl_fragment_shader);

glint success = 0;

glchar errorlog[1024] = ;

gllinkprogram(shaderprogram);

glgetprogramiv(shaderprogram, gl_link_status, &success);

if (success == 0)

glvalidateprogram(shaderprogram);

glgetprogramiv(shaderprogram, gl_validate_status, &success);

if (!success)

gluseprogram(shaderprogram);

// 查詢獲取一致變數的位置

gscalelocation = glgetuniformlocation(shaderprogram, "gscale");

// 檢查錯誤

assert(gscalelocation != 0xffffffff);

}int main(int argc, char** ar**)

printf("gl version: %s\n", glgetstring(gl_version));

glclearcolor(0.0f, 0.0f, 0.0f, 0.0f);

createvertexbuffer();

compileshaders();

glutmainloop();

return 0;

}

相比上個教程做了修改後的shader.vs指令碼**:

#version 330  //告訴編譯器我們的目標glsl編譯器版本是3.3

layout (location = 0) in vec3 position; // 繫結定點屬性名和屬性,方式二緩衝屬性和shader屬性對應對映

uniform float gscale;

void main()

shader.fs指令碼**保持不變:

#version 330  //告訴編譯器我們的目標glsl編譯器版本是3.3

out vec4 fragcolor; // 片段著色器的輸出顏色變數

// 著色器的唯一入口函式

void main()

位於螢幕中心的紅色三角形動態從0放大到原尺寸又縮小到消失,然後翻轉放大後又縮小如此迴圈,也就是後面教程8中的縮放變換效果。

OSG新手使用過程中可能遇到的坑

說明 其實這篇博文內容跟osg關係不大,更確切的說是在使用visual studio的過程中可能遇到的坑。由於osg編譯的過程中會依賴很多第三方庫,還有debug和release版本,確實很容易動態鏈結異常,這是本人在編譯osg程式的過程中遇到的真實問題,故還是放在osg類別中了,希望對新手有用,高...

tiles的使用過程

本文以最簡單而有效的形式記錄tiles的使用過程,以備以後使用時快速參考。1.先建乙個layout.jsp布局頁面 2 新建乙個tiles defs.xml檔案,並在其中做相應的配置。這樣就相當於通過xml檔案定義了乙個member.jsp.3.在web.xml和struts config.xml和...

Mac faceswap 使用過程

報錯資訊 no module 安裝環境 pip3 install opencv python 缺少什麼就install什麼就可以。tensorflow只支援3.6,3.5 2.7 重新配置了python環境。keras 報錯 cannot import name np utils 解決 pip in...