1

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

为什么纹理总是渲染得那么小,即使纹理更高或具有相同的大小?

4

1 回答 1

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)

坐标将是纹理坐标。

于 2013-11-02T13:41:28.013 回答