OpenGLノート(1)

5381 ワード

すべてのOpenGLオブジェクトはそれほど悪くなく、ステータスがあります.以下のような構造体であることを想像してみてください.
struct Object
{
    int count;
    float opacity;
    char *name;
};

この構造体にはいくつかの状態メンバがあり,OpenGLにも同様に状態がある.
状態を変える
C/C++では、インスタンスがある場合は、以下のように状態objを変更することができる.count = 5; オブジェクトのプロパティを直接取得し、直接値を割り当てることができます.
しかしOpenGLでは、そんなことはできません.
歴史が残っている理由(または説明できない他の理由)のため、OpenGLでオブジェクトの状態を変更するには、コンテキストにバインドする必要があります.つまりglBind*関数を先に呼び出す理由です.
glBind*関数はC/C++と同様です.
Object *g_objs[MAX_LOCATIONS] = {NULL};    
void BindObject(int loc, Object *obj)
{
  g_objs[loc] = obj;
}

テクスチャは面白くて、バインドが特殊です.多くのglBind関数には「ターゲット」(target)パラメータがあります.これは、OpenGLコンテキスト内の異なる場所を表します.例えば、バインドフレームが遅い場合には、パラメータオプション(GL_FRAMEBUFFER/GL_READ_FRAMEBUFFER/GL_Draw_FRAMEBUFFER*)があり、これはOpenGLのframe bufferの使用に影響を与える.これは上のlocパラメータに対応します.
テクスチャが特別なのは、ターゲットにバインドされているときにOpenGLが他の情報を得ることです.先にテクスチャをGL_にバインドするとTEXTURE_2 D、実際にOpenGLにこのテクスチャが2 Dテクスチャであることを教えています.その後、変更できない2 Dテクスチャでなければなりません.GLにバインドしようとするとTEXTURE_1 Dまたは別のテクスチャターゲットが実行されると、エラーが発生します.
バインド後、glTexImage 2 D/glTexParameteriなどの関数を呼び出し、現在バインドされているテクスチャオブジェクトを変更します.
グラフィックスにはN個のテクスチャユニット(具体的な数はあなたのグラフィックス能力に依存)があり、各テクスチャユニット(GL_TEXTURE 0、GL_TEXTURE 1など)にはGL_があります.TEXTURE_1D、GL_TEXTURE_2 D等
一、テクスチャ
1.glGenTextures(GLsizei n, GLuint *textures)
は、テクスチャを生成する関数です.

glGenTextures(GLsizei n, GLuint *textures)    

n:         

textures:              

glGenTextures                   ,     [OpenGL],   5     ,
             5   

[glBindTexture]       OpenGL     ,   OpenGL                  
     ,  glBindTexture(GL_TEXTURE_2D,1)  OpenGL      2D       
       1    。

                 glBindTexture     。
    glGenTextures                glGenTextures  ,
       glDeleteTextures  。     [    ]   glGenTextures。


2.glActiveTexture(GL_TEXTURE0);
テクスチャをアクティブにする
glActiveTexture(GL_TEXTURE0);

3.glTexParameteri
テクスチャフィルタ

                   (            ,                  ),     glTexParmeteri()                 .

          :
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  GL_TEXTURE_2D:   2D  .
        GL_TEXTURE_WRAP_S: S        .         GL_CLAMP:         0.0,1.0     .         .    ,         .

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
            ,    T  

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
          
        GL_TEXTURE_MAG_FILTER:     
        GL_LINEAR:     ,                4        .

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
        GL_TEXTURE_MIN_FILTER:     
        GL_LINEAR_MIPMAP_NEAREST:   GL_NEAREST                        ,             . 


4.glBindTexture(GLenum target, GLuint texture);
テクスチャのバインド(Bind Texture)
void glBindTexture(GLenum  target, GLuint  texture);

    :
target
             。         :
 GL_TEXTURE_1D,
 GL_TEXTURE_2D,
 GL_TEXTURE_3D, 
 GL_TEXTURE_1D_ARRAY, 
 GL_TEXTURE_2D_ARRAY,
 GL_TEXTURE_RECTANGLE, 
 GL_TEXTURE_CUBE_MAP, 
 GL_TEXTURE_CUBE_MAP_ARRAY, 
 GL_TEXTURE_BUFFER, 
 GL_TEXTURE_2D_MULTISAMPLE    
 GL_TEXTURE_2D_MULTISAMPLE_ARRAY。
texture
         

二、シェーダ
1.glCreateShader
シェーダの作成(Create Shader)
##  
glCreateShader -          

## C  
GLuint glCreateShader(GLenum *shaderType*)

##   
*shaderType*
                。    **GL_VERTEX_SHADER** **GL_FRAGMENT_SHADER**。

##   
**glCreateShader**           ,             (shader ID)。                     。*shaderType*            。           。 **GL_VERTEX_SHADER**                           。 **GL_FRAGMENT_SHADER**            ,              。

   ,      **GL_SHADER_TYPE**     **GL_VERTEX_SHADER** **GL_FRAGMENT_SHADER**,     *shaderType*  。


2.glBindAttribLocation -
共通頂点属性インデックスを名前付き属性変数に関連付ける
## C  

void **glBindAttribLocation**(GLuint *program*, GLuint *index*, const GLchar **name*);

##   

*program*

                  。
*index*
               。
*name*
               ,                      。

##   
**glBindAttribLocation**                                  。
                          。
                 *index*  。
              ,                  *name*             。


5.glTexImage2D()
2 Dテクスチャを生成
glTexImage2D(GLenum target, GLint level, GLenum internalformat,
GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);

glteximage2d   OpenGL  ,          ,    2D  (Texture)。       glTexImage1D、glTexImage3D。

    :
target       ,      GL_TEXTURE_2D。
level       。0         ,n   N       。
internalformat           。
     GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE, GL_LUMINANCE_ALPHA    。
width          ,   2 n  。         64        
height          ,   2 m  。         64        
border        。   0。
format          ,     internalformatt      。      internalformat。
type            。       GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1。
pixels               

  
       ,       ,    2D  (Texture)。       glTexImage1D、glTexImage3D。
     ,internalformat   ,OpenGL ES2.0 OpenGL 1.0    。OpenGL1.0        1,2,3,4,
            ,                ,     OpenGL ES 2.0                   。
        ,
    glBindTexture(GL_TEXTURE_2D, mTextureID );         ID,   mTextureID。