You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:10:28