這是我基於bada平臺的OpenGL ES 2.0開發系列的下一部分。您可以在此處找到OpenGL ES 2.0的介紹,您應該閱讀它,因為這部分構建於我們上周開發的實例項目之上。在這一部分,我們將首先關注著色器和程序 - 這些都是渲染程序OpenGL ES2.x的基本概念。使用這些對象,您必須對OpenGL的圖形管線的最重要部分進行直接控制。這種控制在對您喜歡的場景進行渲染時能提供巨大的靈活性,帶來很酷的渲染效果。
稍後您會看到更多這些效果,並了解如何正確使用這些工具來實現令人驚嘆的效果。現在,我們將創建最簡單的著色器和方案以渲染多種顏色的三角形。
在我們開始之前,請確保您已對從上一教程下載的項目有所了解。在本教程結束時,您可以下載升級的項目。
著色器和程序
什麼是著色器?(我將儘可能簡化回答 - 有興趣者可以多查查資料以了解更多信息)在OpneGL ES2.x中,著色器是渲染管線的可編程組件。著色器有兩種類型:
1、頂點著色器:允許在頂點上進行一般操作的可編程組件。
2、片段著色器(有時也被稱為像素著色器):允許在片段(即最終像素)上進行一般操作的可編程組件。
正如您可能已經注意到的:它與創建OpenGL自己的可執行的二進位對象有關,該等對象後來對圖形管線有直接影響。
首先,使用C -語法的OpenGL ES著色語言創建一個著色器。
然後,它被編譯成最終著色器對象。
一旦編譯好著色器對象,您可以將它們連結至一個程序對象。
最後,在某一時刻,您能告訴OpenGL ES2.x API使用哪個程序對象進行渲染。
一旦我們完成這項步驟,我們就可以開始繪製三角形。我們只需將我們希望渲染的頂點和顏色傳遞到OpenGL的API。OpenGL ES2.x打開這些陣列並將它們拖過圖形管線。當他們到達我們自己的編程著色器邏輯時,這些點/線/多邊形/像素會按照該著色器邏輯得到修改。最後,渲染的圖像傳送到我們的形式。
多種顏色的三角形 - 示範項目
OpenGLForm修改
在這個例子中,我們必須修改我們最後一個項目的OpenGLForm。您可能還記得,我們要使用OpenGLForm作為其他專門形式的基類,以渲染特定的OpenGL場景。然而,在最後一個項目中,我們只初始化將用於渲染的「畫布」。現在我們要添加一些特殊的功能以納入著色器和程序對象的編譯和連接。
#include <FBase.h>
#include <FUi.h>
#include <FGraphics.h>
#include <FGraphicsOpengl2.h>
class OpenGLForm :
public Osp::Ui::Controls::Form
{
public:
OpenGLForm(){};
OpenGLForm(char* fShaderStr, char* vShaderStr);
virtual ~OpenGLForm();
result Construct();
result OnInitializing(void);
virtual result OnDraw(void){}; // override this
protected:
Osp::Graphics::Opengl::EGLDisplay __eglDisplay;
Osp::Graphics::Opengl::EGLSurface __eglSurface;
Osp::Graphics::Opengl::EGLConfig __eglConfig;
Osp::Graphics::Opengl::EGLContext __eglContext;
Osp::Graphics::Opengl::GLuint __programObject;
char* __fShaderStr;
char* __vShaderStr;
void Commit();
virtual void bindShaderVariables(){}; //override this, used to link/load all attributes
private:
bool InitEGL();
bool InitGL();
Osp::Graphics::Opengl::GLuint LoadShader(Osp::Graphics::Opengl::GLenum type, const char *shaderSrc);
void DestroyGL();
};
首先,我們創建一個新的構造器,其接受帶有著色器原始碼的兩個字符串。我們存儲這些字符串的引用作為成員對象(見11、22、23行)
然後,我們將OnDraw()回調方法留白。派生形式應覆蓋它來繪製其特定的OpenGL場景(見15行)。要在拖至OpenGL ES API後進行更改,我們會創建一個特殊的方法Commit()(見25行)
然後,我們還創建了一個成員對象,其將存儲程序對象引用(我們的著色器被連結到該處)(見21行)
此外,我們創建一種新的方法,其將初始化程序對象:InitGL()(見29行)
然後,我們需要使用一種方法bindShaderVariables(),其連結著色器腳本中的屬性(以及其他「變量」)至我們自己的C + +變量。我們將此留白 - 它是由派生類使用/連結他們需要的屬性(見26行)。不要擔心此意義 - 在幾分鐘內您會看到一個例子。
最後,我們需要使用一種方法,其可以創建和編譯我們的著色器對象,辦法是向其提供著色器原始碼 - LoadShader(類型、源)(見30行)