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。