奇怪的是,我传递给GLSL的每个整数都是0,我发送了一个填充了2s和1s的数组但是全部读了0.整数被发送到OpenGL来选择纹理所以我只得到与0相对应的纹理。这里是我的顶点着色器:
String vertexshader = "#version 330 core"
+ System.getProperty("line.separator")
+ "in vec4 vertexin;"
+ "in vec2 textcoords;"
+ " in int yup;"
+ "uniform mat4 orthogonal;"
+ "out vec2 supertextcoords;"
+ "out int yup1;"
+ "void main(){"
+ "gl_Position = orthogonal * vertexin ;"
+ "supertextcoords = textcoords;"
+ "yup1=yup;"
+ "}";
这是片段着色器:
String fragmentshader="#version 330 core"
+ System.getProperty("line.separator")
+"out vec4 outcolor;"
+"flat in int yup;"
+"in vec2 supertextcoords;"
+"uniform sampler2D texture1;"
+"uniform sampler2D texture2;"
+"void main(){"
+"vec4 texturev1=texture2D(texture1, supertextcoords);"
+"vec4 texturev2=texture2D(texture2, supertextcoords);"
+"vec4 final=texture2D(texture2, supertextcoords);"
+ "if(yup==1){final=texturev1; outcolor=final;}else if(yup==0){"
+"final=texturev2; outcolor=final;}else{"
+ "final=vec4(0,1,0,0); outcolor=final;}"
我发送整数的方式是
glEnableVertexAttribArray(2);
glVertexAttribIPointer(2,1,GL_INT,0,(vertices.length+textcoord.length)*4);
glDrawArrays(GL_TRIANGLES, 0, vertices.length/4);
glDisableVertexAttribArray(2);
应该将10个数字发送到OpenGL以获取多维数据集。每个三角形1个数字(缺少背面)来决定每个尺寸的纹理。每隔一个数字与第一个数字相同,以使纹理相等。但是只使用了texturev2。我想要进行这个实验的纹理是vec4(0,1,0,0);因为数字是2并且落在映射范围之外。为什么?如果您需要更多来源请求。
答案 0 :(得分:1)
在您的顶点着色器中,您有yup1
作为输出,但在片段着色器中没有相应的yup1
作为输入。
除了精确的符号匹配之外,OpenGL没有办法在程序部分之间链接非块in
/ out
声明。未链接的输入在运行时没有任何特别有用的东西。
在片段着色器更改
中flat in int yup;
到
flat in int yup1;
以便它匹配顶点着色器中的out int yup1
声明。