Opengl es 在OpenGL ES 2.0中旋转时,仅显示半个三角形
我试着绕Y轴旋转一个三角形。当我绕Z轴旋转时,一切都很好。但是当我试着绕Y轴旋转时,我得到的只是一个半三角形,绕Y轴旋转。我正在使用PowerVRs OpenGL ES 2.0 SDK。下面是我的Init和Draw函数Opengl es 在OpenGL ES 2.0中旋转时,仅显示半个三角形,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,我试着绕Y轴旋转一个三角形。当我绕Z轴旋转时,一切都很好。但是当我试着绕Y轴旋转时,我得到的只是一个半三角形,绕Y轴旋转。我正在使用PowerVRs OpenGL ES 2.0 SDK。下面是我的Init和Draw函数 int Init(ESContext* esContext) { UserData* userData = (UserData *)esContext->userData; const char *vShaderStr = "attribut
int Init(ESContext* esContext)
{
UserData* userData = (UserData *)esContext->userData;
const char *vShaderStr =
"attribute vec4 vPosition; \n"
"uniform mat4 MVPMatrix;"
"void main() \n"
"{ \n"
" gl_Position = MVPMatrix * vPosition;\n"
"} \n";
const char *fShaderStr =
"precision mediump float; \n"
"void main() \n"
"{ \n"
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n"
"} \n";
GLuint vertexShader;
GLuint fragmentShader;
GLuint programObject;
GLint linked;
GLfloat ratio = 320.0f/240.0f;
vertexShader = LoadShader(GL_VERTEX_SHADER, vShaderStr);
fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fShaderStr);
programObject = glCreateProgram();
if (programObject == 0)
return 0;
glAttachShader(programObject, vertexShader);
glAttachShader(programObject, fragmentShader);
glBindAttribLocation(programObject, 0, "vPosition");
glLinkProgram(programObject);
glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &linked);
if (!linked)
{
GLint infoLen = 0;
glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1)
{
char* infoLog = (char *)malloc(sizeof(char) * infoLen);
glGetProgramInfoLog(programObject, infoLen, NULL, infoLog);
free(infoLog);
}
glDeleteProgram(programObject);
return FALSE;
}
userData->programObject = programObject;
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glViewport(0, 0, esContext->width, esContext->height);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(userData->programObject);
userData->angle = 0.0f;
userData->start = time(NULL);
userData->ProjMatrix = PVRTMat4::Perspective(ratio*2.0f, 2.0f, 3.0f, 7.0f, PVRTMat4::eClipspace::OGL, false, false);
userData->ViewMatrix = PVRTMat4::LookAtLH(PVRTVec3(0.0f, 0.0f, -3.0f), PVRTVec3(0.0f, 0.0f, 0.0f), PVRTVec3(0.0f, 1.0f, 0.0f));
return TRUE;
}
void Draw(ESContext *esContext)
{
GLfloat vVertices[] = {0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f};
GLint MVPHandle;
double timelapse;
PVRTMat4 MVPMatrix = PVRTMat4::Identity();
UserData* userData = (UserData *)esContext->userData;
timelapse = difftime(time(NULL), userData->start) * 1000;
if(timelapse > 16.0f) //Maintain approx 60FPS
{
if (userData->angle > 360.0f)
{
userData->angle = 0.0f;
}
else
{
userData->angle += 0.1f;
}
}
userData->ModelMatrix = PVRTMat4::RotationY(userData->angle);
MVPMatrix = userData->ViewMatrix * userData->ModelMatrix;
MVPMatrix = userData->ProjMatrix * MVPMatrix;
MVPHandle = glGetUniformLocation(userData->programObject, "MVPMatrix");
glUniformMatrix4fv(MVPHandle, 1, FALSE, MVPMatrix.ptr());
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
eglSwapBuffers(esContext->eglDisplay, esContext->eglSurface);
}
PVRTMat4::Perspective(比率*2.0f、2.0f、3.0f、7.0f,PVRTMat4::eclipsespace::OGL、false、false)
将近剪裁平面放置在距离相机3.0f
单位处(通过)
PVRTMat4::lookatth(PVRTVec3(0.0f,0.0f,-3.0f),PVRTVec3(0.0f,0.0f,0.0f),PVRTVec3(0.0f,1.0f,0.0f))代码>将摄影机放置在(0,0,-3)处,并向后看(0,0,0)
直接使用PVRTMat4::RotationY(userData->angle)生成模型矩阵代码>以便矩阵不进行转换。正在绘制的三角形将根据其几何图形保持在(0,0,0)上的位置
所以现在发生的事情是,三角形中靠近摄影机超过3个单位的部分被近剪裁平面剪裁。近剪裁平面的目的是有效地将相机的镜头相对于图像将被感知的位置放置。或者,如果您愿意,也可以指定用户到屏幕的距离
因此,您需要使“近剪裁”平面更靠近摄影机,或将摄影机移离三角形更远