纹理采样时的sample值的设置问题
在红宝书第六章纹理视图的源代码中,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的值进行采样,请问这是为什么?
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的值进行采样,请问这是为什么?
...全文
相关推荐
8.5纹理采样1
纹理采样过程发生在像素着色器中,使用Texture2D对象的Sample方法。该方法接收两个参数:一个是SamplerState对象,另一个是纹理坐标。
lp_tex_sample.rar_LP_tex
**纹理过滤**:当纹理坐标不是整数时,需要通过过滤技术(如最近邻、双线性或三线性过滤)来插值计算出采样颜色。这有助于避免锯齿状边缘和像素化效果。3.
Shadow Map在DirectX9_0 SDK Sample 的实现方法
在DirectX9.0 SDK Sample中,实现Shadow Map的步骤大致分为以下几个阶段:1. **设置光源和深度纹理**:首先,我们需要定义光源的位置和方向,以及生成深度纹理的分辨率。
opengl 3dTexture sample
**纹理参数设置**:设置纹理参数,如过滤模式(`GL_TEXTURE_MIN_FILTER`和`GL_TEXTURE_MAG_FILTER`)决定在纹理采样时如何处理纹理坐标超出纹理边界的情况。
DirectXTK Simple Win32 Sample
**资源管理**:有效管理Direct3D资源(如纹理和缓冲)的生命周期,防止内存泄漏和性能问题。10. **窗口大小调整**:当窗口大小改变时,需要更新视口和投影矩阵以适应新的分辨率。


OpenAPI
