2017-08-09 9 views
0

テクスチャをメモリに保存したいのですが。次に、このテクスチャの一部をOpenGLコンテキストにレンダリングしたいと思います。私はこれを行う方法を知りたいです。テクスチャをメモリに保存してその一部をレンダリングする方法

これまでのところ、頂点データを設定しました。

GLfloat texture[] = 
{ 
    -0.5f, 0.5f, 0.0f,  0.1f, 0.0f, 0.0f, 1.0f, 1.0f, // top rght 
    0.5f, 0.5f, 0.0f,  0.0f, 0.1f, 0.0f, 1.0f, 0.0f, // bottom right 
    0.5f, -0.5f, 0.0,  0.0f, 0.0f, 0.1f, 0.0f, 0.0f, // bottom left 
    -0.5f, -0.5f, 0.0f,  0.0f, 0.0f, 0.0f, 0.0f, 1.0f, // top left 
}; 
私はその後、

GLuint indices[] = 
{ 
    0, 1, 3, //First triangle 
    1, 2, 3 //Second triangle 
}; 

GLuint VBO, VAO, EBO; 
glGenVertexArrays(1, &VAO); 
glGenBuffers(1,& VBO); 
glGenBuffers(1, &EBO); 

glBindVertexArray(VAO); 
glBindBuffer(GL_ARRAY_BUFFER, VB); 
glBufferData(GL_ARRAY_BUFFER, sizeof(texture), texture, GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 
//position attributes 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0); 
glEnableVertexAttribArray(0); 
//colour attributes 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); 
glEnableVertexAttribArray(1); 
//TexCoord attribute 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); 
glEnableVertexAttribArray(2); 
glBindVertexArray(0); //unbind VAO 

負荷をOpenGLの機能をVBOを作成し、使用しての通常の手順を経るとテクスチャ作成

GLuint texture0; 

int width, height; 
unsigned char* image[1]; 

glGenTextures(1, &texture0); 
glBindTexture(GL_TEXTURE_2D, texture0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);//set texture wrapping to GL_REPEAT (usually basic wrapping method) 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
image[0] = SOIL_load_image("Textures/texture.png", &width, &height, 0, SOIL_LOAD_RGB); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image[0]); 
glGenerateMipmap(GL_TEXTURE_2D); 
SOIL_free_image_data(image[0]); 
glBindTexture(GL_TEXTURE_2D, texture0); 

は、私は、whileループを使用しますシェーダをアクティブにしてからテクスチャを描画します。しかし、今私がやりたいことは、このテクスチャをメモリに保存して、その一部だけをレンダリングすることです。 RenderbufferオブジェクトまたはPBOを使用していますか?これを達成するための他の方法がありますか?

答えて

2

ロードされたテクスチャの部分だけをレンダリングしたい場合は、それに応じてVBOのテクスチャ座標を調整します。

シェーダプログラムのtexture(...)関数に渡されるテクスチャ座標は、左下隅を(0,0)、右上隅を(1,1)とマッピングします。したがって、テクスチャの右上隅のみをフラットクワッドにマッピングしたい場合、テクスチャ座標は(0.5,0.5),(0.5,1.0),(1.0,1.0)(1.0,0.5)となります。

ここ

は、頂点とテクスチャがVBOの座標データを次のようになります。

float[] vertices = { 
     0.5, 0.5, 0.0,  // upper left triangle 
    -0.5, 0.5, 0.0, 
    -0.5, -0.5, 0.0, 

     0.5, 0.5, 0.0,  // lower right triangle 
    -0.5, -0.5, 0.0, 
     0.5, -0.5, 0.0 
}; 

float[] textureCoords = { 
    1.0, 1.0, 
    0.5, 1.0, 
    0.5, 0.5, 

    1.0, 1.0, 
    0.5, 0.5, 
    1.0, 0.5 
}; 

あなたは属性2と属性1とtextureCoordsとしてVAOへのデータのロードverticesを持っていたら、次に、あなたのシェーダが何かを見なければなりませんこのような:

バーテックスシェーダ:

in vec3 vertex; 
in vec2 textureCoords; 

out vec2 interpolatedCoords; 

void main(void) { 

    interpolatedCoords = textureCoords; 

    gl_Position = vertex; // You transform these coordinates or whatever you'd like here 

} 

フラグメントシェーダ:シンプルな2Dクワッドにテクスチャの一部をマッピングするほとんど裸の骨の一例だろう

in vec2 interpolatedCoords; 

out vec4 out_color; 

uniform sampler2D texture; 

void main(void) { 

    out_color = texture(texture, interpolatedCoords); 

} 

+0

ありがとうございました!これは私が必要とした答えです:] –

関連する問題