小编sno*_*147的帖子

使用ASSIMP和OpenGL加载3d模型时纹理不正确

我正在尝试通过使用GLUT而不是WGL 修改用于加载ASSIMP 示例代码中包含的3d模型的示例代码.但是,我遇到了纹理问题,如下图所示:

加载3d模型

虽然它应该如下图所示:

原始的3d模型

和绘制下面列出的3D模型的代码:

void recursive_render (const struct aiScene *sc, const struct aiNode* nd, float scale){
unsigned int i;
unsigned int n=0, t;
struct aiMatrix4x4 m = nd->mTransformation;
m.Scaling(aiVector3D(scale, scale, scale), m);
// update transform
m.Transpose();
glPushMatrix();
glMultMatrixf((float*)&m);
// draw all meshes assigned to this node
for (; n < nd->mNumMeshes; ++n){
    const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]];
    apply_material(sc->mMaterials[mesh->mMaterialIndex]);
    if(mesh->mNormals == NULL){
        glDisable(GL_LIGHTING);
    }
    else {
        glEnable(GL_LIGHTING);
    }
    if(mesh->mColors[0] != NULL) {
        glEnable(GL_COLOR_MATERIAL);
    }
    else { …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glut

8
推荐指数
1
解决办法
6567
查看次数

非GLSL OpenGL应用程序中的GPU使用情况

我从OpenGL Wiki中读到,目前的现代GPU只能使用着色器进行编程.

现代GPU不再支持固定功能.一切都是用着色器完成的.为了保持兼容性,GL驱动程序生成一个模拟固定功能的着色器.建议所有新的现代程序都使用着色器.新用户无需学习GL的固定功能相关操作,如glLight,glMaterial,glTexEnv等等.

这是否意味着如果我们不在OpenGL中实现着色器/ GLSL,我们实际上根本不访问GPU而只使用CPU进行计算?

opengl gpu glsl

3
推荐指数
2
解决办法
340
查看次数

GLSL中两个纹理的交替gl_FragColor值

我有两个纹理,云和山,每个都有512 x 512大小,我打算创建一个gl_FragColor输出,它将从以前的纹理获取像素值.在这种情况下,我想gl_FragColor从第一纹理中的第一像素,第二纹理中的第二像素中gl_FragColor的第二像素,第一纹理中的第三像素中gl_FragColor的第三像素等获得第一像素. .这是我的片段着色器代码:

 uniform sampler2D tex0;
 uniform sampler2D tex1;

 void main() {
     vec4 cloud = texture2D(tex0, gl_TexCoord[0].st);
     vec4 hill = texture2D(tex1, gl_TexCoord[0].st);
     for (int i=0;i<512;i++) {
       for (int j=0;j<512;j++) {
            if ( j%2 == 0)
                gl_FragColor =  cloud;
            else
                gl_FragColor =  hill;
          }
     }
  }
Run Code Online (Sandbox Code Playgroud)

这是纹理单元设置:

t1 = loadTexture("pY.raw", 512, 512);
t2 = loadTexture("pZ.raw", 512, 512);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, t2);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t1);
glEnable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)

这是统一的设置:glUseProgram(program);

GLuint t1Location = glGetUniformLocation(program, "tex0");
GLuint t2Location = …
Run Code Online (Sandbox Code Playgroud)

opengl textures glsl

1
推荐指数
1
解决办法
4583
查看次数

标签 统计

opengl ×3

glsl ×2

c++ ×1

glut ×1

gpu ×1

textures ×1