在紅寶書第六章紋理視圖的源代碼中,init函式如下:
void Init()
{
ShaderInfo si[] = { { GL_VERTEX_SHADER, "TextureView.vert" },{ GL_FRAGMENT_SHADER, "TextureView.frag" },{ GL_NONE, NULL } };
Program = LoadShaders(si);
glGenVertexArrays(1, &vert);
glBindVertexArray(vert);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(Verts), Verts, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(Verts->position)));
glEnableVertexAttribArray(1);
glBindVertexArray(0);
float texData[] = { 1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0,
1.0, 1.0 ,0.0, 1.0 };
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexStorage2D(GL_TEXTURE_2D, 2, GL_RGBA8, 2, 2);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_FLOAT, texData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
vglImageData image;
texCube = vglLoadTexture("../../media/test.dds", 0, &image);
e = glGetError();
glGenTextures(6, texPanel);
glTextureView(texPanel[0], GL_TEXTURE_2D, texCube, image.internalFormat, 0, image.mipLevels, 0, 1);
e = glGetError();
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texPanel[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
vglUnloadImage(&image);
glClearColor(0.2f, 0.1f, 0.3f, 1.0f);
glUseProgram(Program);
Sleep(30);
}
display函式如下:
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vert);
vmath::mat4 ModelView = vmath::mat4::identity();
for (int i = 0; i< 1; ++i)
{
for (int j = 0; j < 1; j++)
{
ModelView = vmath::translate(0.63f*i, -0.63f*j, 0.0f);
glUniformMatrix4fv(1, 1, GL_FALSE, ModelView);
//glActiveTexture(GL_TEXTURE0);
//glBindTexture(GL_TEXTURE_2D, tex);
glUniform1i(glGetUniformLocation(Program,"tex"),0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
}
glutSwapBuffers();
glutPostRedisplay();
}
而片元著色器中代碼很簡單,就是:
#version 430 core
in vec2 TexCoord;
layout(location = 0) uniform sampler2D tex;
out vec4 fColor;
void main()
{
fColor = texture(tex, TexCoord);
}
事實上,在display函式中,無論我將sampler2D 的采樣器tex通過glUniform1i設定為0,或者1,顯示的都是系結在GL_TEXTURE1上的texPanel[0]的影像。只有在display中再次將tex系結到GL_TEXTURE0(將注釋掉的兩行重新寫入),才能正確根據glUniform1i的值進行采樣,請問這是為什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/234432.html
標籤:OpenAPI
上一篇:找人
下一篇:關于語意分割資料集構造:
