【问题标题】:texture does not fit on screen纹理不适合屏幕
【发布时间】:2013-11-02 11:36:26
【问题描述】:

我有一个小问题,当我有一个纹理并且我想用 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范围内的quad

我的渲染函数

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();

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

【问题讨论】:

  • 如果您找到了解决方案,请接受答案,或者写一个答案并接受您的答案,所以就像这样。谢谢!

标签: opengl size textures render


【解决方案1】:

纹理坐标从 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)

坐标将是纹理坐标。

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多