OpenGLノート(1)
5381 ワード
すべてのOpenGLオブジェクトはそれほど悪くなく、ステータスがあります.以下のような構造体であることを想像してみてください.
この構造体にはいくつかの状態メンバがあり,OpenGLにも同様に状態がある.
状態を変える
C/C++では、インスタンスがある場合は、以下のように状態objを変更することができる.count = 5; オブジェクトのプロパティを直接取得し、直接値を割り当てることができます.
しかしOpenGLでは、そんなことはできません.
歴史が残っている理由(または説明できない他の理由)のため、OpenGLでオブジェクトの状態を変更するには、コンテキストにバインドする必要があります.つまりglBind*関数を先に呼び出す理由です.
glBind*関数はC/C++と同様です.
テクスチャは面白くて、バインドが特殊です.多くの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)
は、テクスチャを生成する関数です.
2.glActiveTexture(GL_TEXTURE0);
テクスチャをアクティブにする
3.glTexParameteri
テクスチャフィルタ
4.glBindTexture(GLenum target, GLuint texture);
テクスチャのバインド(Bind Texture)
二、シェーダ
1.glCreateShader
シェーダの作成(Create Shader)
2.glBindAttribLocation -
共通頂点属性インデックスを名前付き属性変数に関連付ける
5.glTexImage2D()
2 Dテクスチャを生成
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。