纹理不适合屏幕

时间:2013-11-02 11:36:26

标签: opengl size textures render

我有一个小问题,当我有纹理并且我想用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();

为什么纹理总是渲染得如此之小,即使纹理较高或具有相同的尺寸?

1 个答案:

答案 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)

坐标将是纹理坐标。