OpenGL-为什么我的Z坐标是2倍?

OpenGL-为什么我的Z坐标是2倍?,opengl,shader,Opengl,Shader,这是我的立方体?我已将所有垂直坐标设置为-1或+1,因此每条边的所有距离都应为2.0。但是,只有将Z坐标值减半,它才会显示为立方体 我是否在MVP代码中有我遗漏的错误 glEnableVertexAttribArray( 0 ); glEnableVertexAttribArray( 1 ); glBindBuffer( GL_ARRAY_BUFFER, m_VBO ); // First attributes are the x,y,z coords.. glVerte

这是我的立方体?我已将所有垂直坐标设置为-1或+1,因此每条边的所有距离都应为2.0。但是,只有将Z坐标值减半,它才会显示为立方体

我是否在MVP代码中有我遗漏的错误

  glEnableVertexAttribArray( 0 );
  glEnableVertexAttribArray( 1 );

  glBindBuffer( GL_ARRAY_BUFFER, m_VBO );

  // First attributes are the x,y,z coords..
  glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, CVertex3DC::m_Stride, 0 );

  // Second attribute will be the RGBA
  glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, CVertex3DC::m_Stride, (void *) g_XYZFloatLen );

  // PROJECTION
  glm::mat4 Projection = glm::perspective( 45.0f, g_AspectRatio, 0.1f, 100.0f );

  // VIEW
  glm::mat4 View = glm::mat4(1.0);

  dist = -5.0f;

  View = glm::translate( View, glm::vec3( 0.0f, 0.0f, dist ) );

  // MODEL
  glm::mat4 Model = glm::mat4(1.0);

  rot = 0;

  Model = glm::rotate( Model, rot, glm::vec3( 0.0f, 1.0f, 1.0f ) ); // where x, y, z is axis of rotation (e.g. 0 1 0)

  glm::mat4 MVP;
  MVP = Projection * View * Model;

  GLuint transformLoc;

  transformLoc = glGetUniformLocation( g_ShaderProgram, "transform" );
  glUniformMatrix4fv( transformLoc, 1, GL_FALSE, glm::value_ptr( MVP ) );

  int nOffset = 0;

  // Draw each face..
  for( int f = 0; f < (int) m_Faces.size(); f ++ )
  {
    nOffset = m_Faces[ f ].Render( nOffset );
  }

  glDisableVertexAttribArray( 0 );
  glDisableVertexAttribArray( 1 );

变换矩阵只是真理的一半。在现代GL中,顶点着色器(或者更精确地说:光栅化器之前的所有可编程阶段)负责将对象空间坐标转换为剪辑空间

因此着色器可能会使用矩阵,或者完全忽略它们,或者应用其他变换。在您的情况下,在应用变换矩阵之前,VS会将
x
y
缩放0.5,因此您的对象会在
z
中拉伸


请注意,顶点着色器甚至可能根本不使用输入属性。通过仅生成由
gl\u VertexID
参数化的一些曲面,它可以完全无属性地工作。因此,当只知道顶点数组中的数据和所有制服的状态时,仍然不知道渲染的外观如何(尽管在大多数情况下,将使用数据和制服,否则指定它们将浪费资源).

如果在将旋转轴传递到
glm::rotate
之前对其进行规格化,它会发生变化吗?顶点着色器的外观如何?@derhass:是的!你发现了-X&Y位置减半,但Z不是。哇,我没想到会在里面找到。剪贴的乐趣。我会让你把你的评论变成一个答案,我会为你接受它。
#version 330

layout (location = 0) in vec3 Position;
layout (location = 1) in vec4 color;
layout (location = 2) in vec3 normal;

out vec4 frag_color;

uniform mat4 transform;

void main()
{
  gl_Position = transform * vec4(0.5 * Position.x, 0.5 * Position.y, Position.z, 1.0);

  // Pass vertex color to fragment shader..
  frag_color = color;
}