我有一个小问题,当我有纹理并且我想用opengl在屏幕上渲染它时,即使纹理与屏幕尺寸相同,纹理也会渲染为小。为了将纹理渲染到屏幕,我使用以下着色器:
顶点着色器:
#version 120
attribute vec2 point;
varying vec2 fr_point;
void main(void) {
gl_Position = vec4(point, 0.0, 1.0);
fr_point = point;
}
片段着色器:
#version 120
varying vec2 fr_point;
uniform sampler2D texture;
void main(void) {
gl_FragColor = texture2D(texture, fr_point);
};
顶点属性quad是-1和1
范围内的四元组我的渲染功能
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(p);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(uni_texture, 0);
glEnableVertexAttribArray(att_point);
GLfloat triangle_vertices[] = {
-1., -1.,
-1., 1.,
1., -1,
1., 1,
-1., 1.,
1., -1.
};
glVertexAttribPointer(
att_point,
2,
GL_FLOAT,
GL_FALSE,
0,
triangle_vertices
);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(att_point);
glutSwapBuffers();
为什么纹理总是渲染得如此之小,即使纹理较高或具有相同的尺寸?
答案 0 :(得分:2)
纹理坐标从0到1缩放,因此您必须将四边形坐标转换为纹理坐标。
fr_point = (1+point)/2; //fr_point = (vec2(1)+point.xy)/2
所以
(-1,-1) -> (0,0)
(-1,1) -> (0,1)
(1,1) -> (1,1)
(1,-1) -> (1,0)
坐标将是纹理坐标。