Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++ 使用glvertex4i传递网格面索引时顶点着色器错误_C++_Opengl_Glsl_Opengl Compat - Fatal编程技术网

C++ 使用glvertex4i传递网格面索引时顶点着色器错误

C++ 使用glvertex4i传递网格面索引时顶点着色器错误,c++,opengl,glsl,opengl-compat,C++,Opengl,Glsl,Opengl Compat,正在初始化总账列表以进行处理 glBegin(GL_点); 对于(i=0;iGetFaceNodes(i+1,版本[0],版本[1],版本[2],版本[3]); **glVertex4i(ver[0]-1,ver[1]-1,ver[2]-1,i+1)** } 格伦德(); 格伦德利斯(); 顶点着色器给了我一个编译错误,不知道为什么 顶点着色器: 变化出最终浮点值; 真空总管(真空) { final=float(gl_Vertex.w);//要将此面索引传递给 } 几何体着色器: 在浮点fi

正在初始化总账列表以进行处理

glBegin(GL_点);
对于(i=0;iGetFaceNodes(i+1,版本[0],版本[1],版本[2],版本[3]);
**glVertex4i(ver[0]-1,ver[1]-1,ver[2]-1,i+1)**
}
格伦德();
格伦德利斯();
顶点着色器给了我一个编译错误,不知道为什么

顶点着色器:

变化出最终浮点值;
真空总管(真空)
{
final=float(gl_Vertex.w);//要将此面索引传递给
}
几何体着色器:

在浮点final[]中变化;
变出浮法豆腐;
最终的豆腐渣=最终的[0];
//在这里做其他的计算,它们是完全不同的
片段着色器:

浮动式豆腐渣;
真空总管(真空)
{

如果(color.z,如果您在问题中实际发布了编译错误,则会有所帮助,否则我们不知道您的错误是什么

所以,既然我在黑暗中随机猜测,我将在这里做一些猜测

  • 您正在将浮点指定给整数,这可能会导致转换错误
  • //现在可以编译,但它可能只会给您
    //零还是一,这就是目的吗?
    最终=整数(gl_顶点.w);
    
  • 您没有写入顶点着色器中的gl_位置。如果您没有写入该值,OpenGL将无法执行顶点着色器

  • 在片段着色器中,您正在检查值color.z,但尚未将颜色声明为统一、着色器输入或常量

  • 虽然这不会导致编译错误,但将final(值为1或0的整数)除以100或1000的整数值只会得到0或1。是否打算将final用作浮点而不是整数

  • 您正在片段着色器中的vec4声明中混合整数和浮点。这可能会导致编译器出错


  • 不幸的是,如果无法访问GLSL错误日志,除了我上面列出的以外,任何人都无法识别您的问题。

    由于着色器不包含任何版本信息,因此它是一个着色器

    在GLSL 1.10中,不允许使用类型为
    int
    的变量,也不支持从
    int
    float
    的隐式强制转换。 glsl 1.10没有
    in
    out
    变量。空间间变量的关键字是
    Variable

    此外,在eh片段着色器中未定义变量
    color

    可变浮点数final;
    真空总管(真空)
    {
    最终=gl_顶点.w;
    // [...]
    }
    
    variable float final\豆腐渣;
    真空总管(真空)
    {
    如果(最终豆腐渣<0.0)/?
    gl_-FragData[0]=vec4(final_-tofrag,final_-tofrag,-gl_-FragCoord.z,0.0);
    其他的
    gl_-FragData[0]=vec4(final_-tofrag,final_-tofrag,gl_-FragCoord.z,0.0);
    }
    

    我建议检查着色器编译是否成功以及程序对象链接是否成功

    如果着色器编译成功,可通过和参数
    GL\u COMPILE\u STATUS
    进行检查。例如:

    #包括
    #包括
    
    bool CompileStatus(GLuint着色器)
    {
    闪烁状态=GL_TRUE;
    glGetShaderiv(着色器、GL\u编译状态和状态);
    如果(状态==GL\U FALSE)
    {
    闪烁logLen;
    glGetShaderiv(着色器、GL\u INFO\u LOG\u LENGTH和logLen);
    标准:向量log(logLen);
    葛思哲写的;
    glGetShaderInfoLog(shader,logLen,&write,log.data());
    
    std::cout问题中的代码没有任何意义。之所以选择GLSL关键字
    variable
    ,是因为它旨在反映这样一个属性,即由于原语之间的自动插值,每个片段的数据都会不同。这只会发生在rasrerizer a之前的最后一个可编程着色器阶段之间nd片段着色器

    起初,只有顶点着色器和片段着色器。VS将获取
    属性
    s作为输入,并输出到
    变量
    s,这将是插值并成为FS的输入

    随着GL 3.0/GLSL 1.30中几何体着色器的引入,该方案不再有意义。VS的输出将不再插值,而是成为GS的直接输入。因此,关键字
    属性
    变化
    ,其中从GLSL中删除,并由更通用的替换de>输入
    /
    输出
    方案。


    < > >,< <代码> > 不能存在。您可以使用不支持几何着色器的传统GLSL,或者在/Cuth> Us>代码>中使用一个新的GLSL,代码<>:< /P>这不是OpenGL如何工作。您可以将数据指定为C++中的整数。OpenGL将简单地将整数数据转换成浮点,以便在TH上进行处理。e GPU。对于gl_Vertex,这始终是一个浮点向量4。着色器代码不可能链接或编译。在调用glCompileShader后,glGetShaderInfoLog报告的错误日志是什么?同样,如果您不提供问题中的错误,没有人能够猜到您的问题的解决方案。因此我更改了d代码原因OpenGL不支持不同的int。现在我可以使用上述代码编译代码,并使用上述代码获得面索引的输出,但不确定这些是面索引,因为它们的值在40000-20000之间变化。网格中的总面数为49000。