Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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
Macos 在顶点着色器中设置变量时获得空白屏幕_Macos_Opengl_Glsl - Fatal编程技术网

Macos 在顶点着色器中设置变量时获得空白屏幕

Macos 在顶点着色器中设置变量时获得空白屏幕,macos,opengl,glsl,Macos,Opengl,Glsl,我刚刚在OpenGL3.2中创建了一个简单的矩形,现在我想添加照明支持。但是,每当我尝试将法线移动到片段着色器时,都不会显示任何内容。如果我把那句话注释掉,它又能完美地工作了。这是什么原因造成的?错误日志中没有显示任何内容 顶点着色器: #version 150 in vec4 position; in vec3 inNormal; out vec3 varNormal; uniform mat4 modelViewProjectionMatrix; void main() {

我刚刚在OpenGL3.2中创建了一个简单的矩形,现在我想添加照明支持。但是,每当我尝试将法线移动到片段着色器时,都不会显示任何内容。如果我把那句话注释掉,它又能完美地工作了。这是什么原因造成的?错误日志中没有显示任何内容

顶点着色器:

#version 150

in vec4 position;
in vec3 inNormal;

out vec3 varNormal;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    //varNormal = inNormal; //If I uncomment this line, nothing shows up    
gl_Position = modelViewProjectionMatrix * position;
}
片段着色器:

#version 150

in vec3 varNormal;

out vec4 fragColor;

void main()
{
fragColor = vec4(1, 1, 1, 1);   
}
并传递法线:



GLuint posAttrib = 0;
GLuint normalAttrib = 1;

glBindAttribLocation(program, posAttrib, "position");
glBindAttribLocation(program, normalAttrib, "normalAttrib");

//Building the VAO's/VBO's
GLfloat posCoords[] = 
{
    -10, 0.0, -10,
    -10, 0.0, 10,
    10, 0.0, 10,
    10, 0.0, -10,   
};

GLfloat normalCoords[] = 
{
    0, 0, 1,
    0, 0, 1,
    0, 0, 1,
    0, 0, 1
};

glGenVertexArrays(1, &vaoName);
glBindVertexArray(vaoName);

GLuint posBuffer;
glGenBuffers(1, &posBuffer);
glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(posCoords), posCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(posAttrib);   
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

GLuint normalBuffer;        
glGenBuffers(1, &normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(normalCoords), normalCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(normalAttrib);
glVertexAttribPointer(normalAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

我还没有试着把我所有的立场和正常的协调放在一个VBO中,但我不想求助于这种方法

不确定这是您的实际代码还是剪切粘贴,但调用GLBindAttriblLocation仅在下一次调用glLinkProgram后生效


如果在调用glBindAttrib后没有链接程序,这些链接将不会生效,并且您的属性可能会被赋予错误的索引。这可以解释为什么在取消对正常行的注释后会出现不同的行为。

这可能是修复此问题最奇怪的原因,但它是有效的

首先,确保您知道OpenGL分析器是如何工作的。有一个由

在glDrawElements之前/之后设置断点(或glDrawArray,具体取决于您使用的内容)

然后查看程序的顶点属性,确保位置有序

如果它们不是,请重新排列它们

来自(或任何其他):

致:


不知道这是如何发生的以及为什么发生的,但这是问题的解决方案。

它们已经使用字符串数组声明了,我只是没有将其包含在我的代码片段中,因为我认为这是不必要的。“属性”和“制服”不是两个不同的东西吗?它只是剪切粘贴在这里,因为有人对我的问题发表了评论,说我应该在我的问题中添加更多内容,但后来他删除了他的评论,所以。。。
enum
{
POSITION_ATTR = 0,
TEXTURE_ATTR=1,
NORMAL_ATTR=2,
};
enum
{
NORMAL_ATTR = 0,
TEXTURE_ATTR=2,
POSITION_ATTR=1,
};