Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL中的视差映射故障_C++_Opengl_Glsl - Fatal编程技术网

C++ OpenGL中的视差映射故障

C++ OpenGL中的视差映射故障,c++,opengl,glsl,C++,Opengl,Glsl,这是在将切线向量转移到顶点着色器之后,我反转切线向量的结果: 该“阴影”位于错误的位置。 (只有当我通过Y轴旋转它时,它才能工作,所以最后一张图像似乎呈现了一个良好的视差贴图立方体) 我确定这不是切线向量或纹理坐标问题 因为 我使用了与工作演示中完全相同的切线计算函数和立方体位置、法线和纹理坐标数据。 毕竟,我将带有position/texcoord/normal/tangent数据的数组导出到了一个.txt文件中,我看到了我所期望的(我期望的是与工作演示中相同的pos/tex/norm数据

这是在将切线向量转移到顶点着色器之后,我反转切线向量的结果:

该“阴影”位于错误的位置。

(只有当我通过Y轴旋转它时,它才能工作,所以最后一张图像似乎呈现了一个良好的视差贴图立方体)

我确定这不是切线向量或纹理坐标问题

因为

我使用了与工作演示中完全相同的切线计算函数和立方体位置、法线和纹理坐标数据。 毕竟,我将带有position/texcoord/normal/tangent数据的数组导出到了一个.txt文件中,我看到了我所期望的(我期望的是与工作演示中相同的pos/tex/norm数据,包括我从工作演示中导出的计算切线)

下一个参数是,我将着色器代码复制到一个正在工作的演示中,它仍然可以工作。 另一个是,我尝试了多种方法来渲染这个立方体。 我用glVertexAttribPointer尝试了VBO,用切线保存为其他纹理坐标尝试了VBO(如演示中所示),用glVertexAttrib4f尝试了DisplayList。结果是完全一样。

高度贴图加载正确,我尝试将其设置为漫反射贴图,结果看起来不错。 glGetError()没有给我错误,着色器编译日志也这么说

它可能是带有照相机或初始状态的东西

也许发布init代码会有所帮助

void CDepthBase::OpenGLSet() {

    glEnable( GL_TEXTURE_2D );
    glShadeModel( GL_SMOOTH );
    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    glClearDepth( 1.0f );
 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glDepthFunc( GL_LEQUAL );
    glEnable(GL_DEPTH_TEST);



    glBlendFunc( GL_ONE, GL_ONE );
    GLfloat ratio;

    glViewport(0, 0, ResolutionWidth, ResolutionHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, ResolutionWidth / (float)ResolutionHeight, 0.1f, 900.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    if (GLEW_OK != glewInit()) {
        MBX("Failed to init GLEW.", "Error");
    }
    if (glewIsSupported("GL_ARB_vertex_buffer_object")) {
        VBO_supported = true;


    } else VBO_supported = false;

 glHint( GL_FOG_HINT, GL_DONT_CARE );      
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
 glShadeModel(GL_SMOOTH);

    glAlphaFunc(GL_ALWAYS, 0);
}
顺便说一句,我使用的是带有扩展的GL扩展Wrangler

着色器代码和日志(此导出文件包含直接传递给glShaderSource的代码):

制服工作正常,因为如果我用常量值切换它们,结果是相同的。 编译着色器:

void __Shader::import(){
    if(imported) __Shader::~__Shader();

        v = glCreateShader(GL_VERTEX_SHADER);
        f = glCreateShader(GL_FRAGMENT_SHADER); 


        glShaderSource(v, 1, (const GLchar **)&vsrc.cstr,NULL);
        glShaderSource(f, 1, (const GLchar **)&fsrc.cstr,NULL);

        glCompileShader(v);
        glCompileShader(f);

        p = glCreateProgram();

        glAttachShader(p,v);
        glAttachShader(p,f);

        if(_flags & NORMAL_MAPPING) 
            glBindAttribLocation(p, ATTRIB_TANGENT, "tangent");

        glLinkProgram(p);

        if(_flags & DIFFUSE_MAPPING) 
            diffuseUni.loc = glGetUniformLocation(p, "diffuseMap");
        if(_flags & NORMAL_MAPPING) 
            normalUni.loc = glGetUniformLocation(p, "normalMap");
        if(_flags & PARALLAX_MAPPING) 
            heightUni.loc = glGetUniformLocation(p, "heightMap");
        if(_flags & SPECULAR_MAPPING) 
            specularUni.loc = glGetUniformLocation(p, "specularMap");

        imported = true;
}
在VBO中设置属性:

    if(tangents.size() > 0){
        buffered |= 3;
        glGenBuffers(1, &VBO_tangent);
        glBindBuffer(GL_ARRAY_BUFFER, VBO_tangent);
        glBufferData(GL_ARRAY_BUFFER, tangents.size()*sizeof(tangent), tangents.get_ptr(), GL_STATIC_DRAW);
    }

// and in draw:

if(buffered & 3) {

        glBindBuffer(GL_ARRAY_BUFFER, VBO_tangent);    
        glVertexAttribPointer(__Shader::ATTRIB_TANGENT, 4, GL_FLOAT, GL_FALSE, 0, 0);   
        glEnableVertexAttribArray(__Shader::ATTRIB_TANGENT);  
    }
还有一张小纸条

for(int i = 0; i < responders.size(); ++i)
if(strstr(responders[i].idea, "tangent problem"))
responders[i].please_dont_talk();
for(int i=0;i

告诉我你对这些坏结果的原因的其他想法。

Wheew。。。已经解决了。问题是加载纹理文件时,即使我没有看到漫反射贴图或漫反射+法线贴图出现任何混乱。我用的是SDL的IMG_加载,也许我用错了,但它对我不起作用。这可能是正常的地图弄乱了

错误的纹理导入代码:

if(imported || filenamez.length() < 1) return;
    SDL_Surface* surface = 0;


        surface = IMG_Load(filenamez.c_str());

    if (surface) { 
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    bool endianess = filenamez.substr(filenamez.length()-4) == ".jpg";
        glTexImage2D(GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0, 
            (endianess ? GL_RGB : GL_BGR), GL_UNSIGNED_BYTE, surface->pixels);

    }
if(imported | | filenamez.length()<1)返回;
SDL_表面*表面=0;
surface=IMG_Load(filenamez.c_str());
如果(表面){
glGenTextures(1,&纹理);
glBindTexture(GL_TEXTURE_2D,纹理);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
bool endianess=filenamez.substr(filenamez.length()-4)=“.jpg”;
glTexImage2D(GL_纹理_2D,0,3,表面->w,表面->h,0,
(endianess?GL_RGB:GL_BGR),GL_无符号字节,表面->像素);
}
当心

我现在使用的是从dhpoware演示中获取的基于HBITMAP的纹理加载,我刚才提到的。而且效果很好

和平。

经过2-3天的艰苦调试,让我感到有点欣喜若狂

哦,我忘了,最后的结果是:

请将后两个问题中的信息添加到第一个问题中,然后关闭后两个问题。一个问题只需要一个问题。如果你那样做,我会看的。好的,我做到了。这些都是需要的信息。好的,我将投票关闭另外两个(&)作为重复项。看起来你的着色器代码在这个问题中丢失了,我会让你编辑它,以防任何事情发生变化。你能把代码贴在你设置着色器变量的地方吗?@Glorian:如果你说这个演示可以用,试着把这个演示一行一行地修改到你的代码中。当它停止工作时,看看你改变了什么。非常好,看起来很好。很高兴你解决了这个问题,很抱歉我没有明确回复你。早些时候我看了你的东西,没有发现任何问题。我刚想回来再看一眼,你就明白了。:)我也有同样的问题。。。除了我使用的是另一种语言,它有自己的图像加载器。你知道你使用的装载机有什么不同吗?我是否可以对着色器进行一些更改来补偿这一点?我一直在试验每一个变量,但它们似乎都会使事情变得更糟,当改变…找到它!我以前试过这个,但是还有其他问题。基于法线贴图计算法线时,求反y值。类似于:vec3n=规格化(texture2D(normalMap,newTexCoord).rgb*2.0-1.0);n、 y=-n.y;把它修好了!
if(imported || filenamez.length() < 1) return;
    SDL_Surface* surface = 0;


        surface = IMG_Load(filenamez.c_str());

    if (surface) { 
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    bool endianess = filenamez.substr(filenamez.length()-4) == ".jpg";
        glTexImage2D(GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0, 
            (endianess ? GL_RGB : GL_BGR), GL_UNSIGNED_BYTE, surface->pixels);

    }