同一OpenGL代码在不同PC上渲染效果不一致问题求助
问题:OpenGL相机Z轴翻滚在不同PC上渲染效果不一致
同一OpenGL代码在两台PC上运行时,相机沿Z轴翻滚(类似头部向两侧倾斜)的表现存在差异:其中一台PC仅呈现正常旋转,纹理尺寸保持不变;另一台PC上,翻滚角度越大,纹理拉伸越明显(画面变宽)。
我使用cglm库,结合相机视场角与计算得到的相机结果四元数来生成Model、View、Projection(MVP)矩阵,并传入顶点着色器,但相同代码在不同设备上表现不同。
核心代码实现
相机旋转模拟(多线程版)
void *fake_headtracking(void *c_ptr){ my_camera_t *c = c_ptr; versor rollQuat, pitchQuat, yawQuat; glm_quat_identity(rollQuat); glm_quat_identity(yawQuat); glm_quat_identity(pitchQuat); float yaw, pitch, roll; yaw = 180; pitch = 0; roll = 0; float yawd = 1; float pitchd = 1; float rolld = -1; while(!EXIT){ // yaw += yawd; // pitch += pitchd; roll += rolld; if (roll >= 50 || roll <=-50) rolld = -rolld; if (pitch >= 50 || pitch <=-50) pitchd = -pitchd; if (yaw >= 50 || yaw <=-50) yawd = -yawd; glm_quatv(pitchQuat, my_radians(pitch), (vec3){1.0f, 0.0f, 0.0f}); glm_quatv(yawQuat, my_radians(yaw), (vec3){0.0f, 1.0f, 0.0f}); glm_quatv(rollQuat, my_radians(roll), (vec3){0.0f, 0.0f, 1.0f}); glm_quat_mul(yawQuat, pitchQuat, c->resultQuat); glm_quat_mul(c->resultQuat, rollQuat, c->resultQuat); usleep(15000); } return NULL; }
渲染前矩阵计算与提交
// generate projection matrix glm_perspective(cam.fov, (GLfloat)SCR_WIDTH / (GLfloat)SCR_HEIGHT, 0.01f, 100.0f, proj); // zoom // generate view matrix glm_quat_look(cam.cameraPos, cam.resultQuat, view); // send MVP matrices to vertex shader my_send_shander_4x4_matrix(modelLoc, 1, &model[0][0]); my_send_shander_4x4_matrix(viewLoc, 1, &view[0][0]); my_send_shander_4x4_matrix(projLoc, 1, &proj[0][0]); my_bind_texture(textures[0]); my_bind_vertex_object_and_draw_it(VAOs[0], GL_TRIANGLES, myWin.numTriangles);
顶点着色器代码
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord; out vec2 TexCoord; uniform mat4 model; uniform mat4 view; uniform mat4 proj; void main(){ gl_Position = proj*view*model*vec4(aPos.x, aPos.y, aPos.z , 1.0); TexCoord = vec2(1.0 - aTexCoord.x, aTexCoord.y); }
设备配置
- PC1:Jetson AGX Xavier,Ubuntu 18,NVIDIA Volta GPU
- PC2:Lenovo Ideapad,Ubuntu 18,NVIDIA GeForce mx150
补充:单线程渲染循环(问题依旧)
versor rollQuat, pitchQuat, yawQuat; glm_quat_identity(rollQuat); glm_quat_identity(yawQuat); glm_quat_identity(pitchQuat); float yaw, pitch, roll; yaw = 180; pitch = 0; roll = 0; float yawd = 1; float pitchd = 1; float rolld = -1; while (!EXIT){ // render loop processInput(window); roll += rolld; if (roll >= 50 || roll <=-50) rolld = -rolld; if (pitch >= 50 || pitch <=-50) pitchd = -pitchd; if (yaw >= 50 || yaw <=-50) yawd = -yawd; glm_quatv(pitchQuat, my_radians(pitch), (vec3){1.0f, 0.0f, 0.0f}); glm_quatv(yawQuat, my_radians(yaw), (vec3){0.0f, 1.0f, 0.0f}); glm_quatv(rollQuat, my_radians(roll), (vec3){0.0f, 0.0f, 1.0f}); glm_quat_mul(yawQuat, pitchQuat, cam.resultQuat); glm_quat_mul(cam.resultQuat, rollQuat, cam.resultQuat); usleep(15000); // render my_clear_color_buffer(0.2f, 0.2f, 0.2f, 1.0f); my_clear_buffer(GL_COLOR_BUFFER_BIT); // | GL_DEPTH_BUFFER_BIT); // generate projection matrix glm_perspective(cam.fov, (GLfloat)SCR_WIDTH / (GLfloat)SCR_HEIGHT, 0.01f, 100.0f, proj); // zoom // generate view matrix glm_quat_look(cam.cameraPos, cam.resultQuat, view); // send MVP matrices to vertex shader my_send_shander_4x4_matrix(modelLoc, 1, &model[0][0]); my_send_shander_4x4_matrix(viewLoc, 1, &view[0][0]); my_send_shander_4x4_matrix(projLoc, 1, &proj[0][0]); my_bind_texture(textures[0]); my_bind_vertex_object_and_draw_it(VAOs[0], GL_TRIANGLES, myWin.numTriangles); // glfw: swap buffers and poll IO events my_swap_buffers(window); my_pool_events(); }
内容的提问来源于stack exchange,提问作者Filip Vuković
相关产品推荐
相关产品推荐

