Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 glsl着色器或使用它的代码_C++_Opengl_Glsl - Fatal编程技术网

C++ 协助调试OpenGL glsl着色器或使用它的代码

C++ 协助调试OpenGL glsl着色器或使用它的代码,c++,opengl,glsl,C++,Opengl,Glsl,我正在将phong着色器添加到我的工作程序中。基本上,在我实现新着色器之后,我的代码在以下过程中会出现“Segmentation Fault:11”: 我知道元素的数量是正确的,因为它适用于我以前的简单着色器 这是我的顶点着色器: // vertex shader attribute vec4 vPosition; attribute vec3 vNormal; varying vec4 color; //vertex shader // light and material propertie

我正在将phong着色器添加到我的工作程序中。基本上,在我实现新着色器之后,我的代码在以下过程中会出现“Segmentation Fault:11”:

我知道元素的数量是正确的,因为它适用于我以前的简单着色器

这是我的顶点着色器:

// vertex shader
attribute vec4 vPosition;
attribute vec3 vNormal;
varying vec4 color; //vertex shader
// light and material properties
uniform vec4 AmbientProduct, DiffuseProduct, SpecularProduct; 
uniform mat4 ModelView;
//uniform mat4 Projection;
uniform vec4 LightPosition;
uniform float Shininess;
vec3 L, H, N, pos, E;
vec4 diffuse, specular, ambient;
float Kd, Ks;

void main()
{
// Transform vertex position into eye coordinates 
pos = (ModelView * vPosition).xyz; 
L = normalize( LightPosition.xyz - pos ); 
E = normalize( -pos );
H = normalize( L + E );
// Transform vertex normal into eye coordinates
N = normalize( ModelView*vec4(vNormal, 0.0) ).xyz;
// Compute terms in the illumination equation 
ambient = AmbientProduct;
Kd = max( dot(L, N), 0.0 );
diffuse = Kd*DiffuseProduct;
Ks = pow( max(dot(N, H), 0.0), Shininess );
specular = Ks * SpecularProduct;
if( dot(L, N) < 0.0 ) 
specular = vec4(0.0, 0.0, 0.0, 1.0); 

gl_Position = ModelView * vPosition;
color = ambient + diffuse + specular;
color.a = 1.0; 
        }
如果您有任何问题,请随时提问,我将详细说明。我觉得顶点着色器本身有问题,或者我与着色器交互的方式有问题。接受任何帮助或建议

编辑::(编辑代码以反映解决方案)问题出现在第二个:

glVertexAttribPointer(vShaderPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset));
应该是这样的:

glVertexAttribPointer(vShaderNormal, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset));
这是一个愚蠢的复制/粘贴错误。但是,成品看起来仍然不正确:

!![旋转0时,它似乎已完全着色][1]

!![稍微旋转一点显示出一些奇怪的行为][2]

!![更多的旋转会让你把头发拔出来][3]

i、 stack.imgur.com/lYOzK.png

!![然后它变白了,你知道我搞砸了!!][4]

i、 stack.imgur.com/FZcqF.png

所以,当你旋转的时候,颜色会变得一团糟,变成白色,黑色,图案等等,但这显然是不正确的

编辑:::这是我试图“纠正”使用vNormal传递错误数量值的问题:

void init() {
// Create a vertex array object
GLuint vao;
#ifdef __APPLE__
glGenVertexArraysAPPLE( 1, &vao );
glBindVertexArrayAPPLE( vao );
#else
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
#endif

// Create and initialize a buffer object
GLuint buffer;
realVec *normArray = new realVec[mCubes.getNormalArraySize()];//vec4 array compared to vec3 array     
normArray = mCubes.getNormalVector(); // new array of normals

for(int i=0; i<mCubes.getArrayNumberOfElements();i++){
    printf("Normal at %d  is %f \n",i,normArray[i][0]); //to print normals
    printf("Normal at %d  is %f \n",i,normArray[i][1]); //to print normals
    printf("Normal at %d  is %f \n",i,normArray[i][2]); //to print normals
}

glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData( GL_ARRAY_BUFFER,
             mCubes.getDisplayArraySize() + mCubes.getNormalArraySize(),                NULL, GL_STATIC_DRAW ); //Changed size for vec3 array of normals
GLintptr offset = 0;
glBufferSubData(GL_ARRAY_BUFFER, offset, mCubes.getDisplayArraySize(), mCubes.getDisplayArray());
offset+= mCubes.getDisplayArraySize();

glBufferSubData(GL_ARRAY_BUFFER, offset, mCubes.getNormalArraySize(), normArray);

// Load shaders and use the resulting shader program
string evname = "PROTCAD3DIR";
string path = PCGeneralIO::getEnvironmentVariable(evname);

path += "/data/shaders/";
#ifdef __APPLE__
string vshadername = path + "kw_vshader1_mac.glsl";
string fshadername = path + "kw_fshader1_mac.glsl";
//#else
//  string vshadername = path + "kw_vshader1.glsl";
//  string fshadername = path + "kw_fshader1.glsl";
#endif

GLuint program = InitShader( vshadername.c_str(), fshadername.c_str() );

glUseProgram(program);
//offset =0;
// Initialize the vertex position attribute from the vertex shader    
GLuint vShaderPosition = glGetAttribLocation(program, "vPosition");
glEnableVertexAttribArray(vShaderPosition);
glVertexAttribPointer(vShaderPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

GLuint vShaderNormal = glGetAttribLocation(program, "vNormal");
glEnableVertexAttribArray(vShaderNormal);
glVertexAttribPointer(vShaderNormal, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset));


//vShaderMatrix = glGetUniformLocation(program, "vMatrix");
//vShaderColor = glGetUniformLocation(program, "vColor")
vShaderModelView = glGetUniformLocation(program, "ModelView");
vShaderLightPosition = glGetUniformLocation(program, "LightPosition");
//vShaderProjection = glGetUniformLocation(program, "Projection");

vShaderAmbientProduct = glGetUniformLocation(program, "AmbientProduct");
vShaderDiffuseProduct = glGetUniformLocation(program, "DiffuseProduct");
vShaderSpecularProduct = glGetUniformLocation(program, "SpecularProduct");
vShaderShininess = glGetUniformLocation(program, "SpecularProduct");
glEnable( GL_DEPTH_TEST );

vec4 light = vec4(0.5,1.5,1.0,0.0);
glUniform4fv(vShaderLightPosition, 1, light);
vec4 amb = vec4(1.0f,0.0f,0.20f,1.0f);
glUniform4fv(vShaderAmbientProduct, 1, amb);
vec4 diff = vec4(0.5f,0.5f,0.5f,1.0f);
glUniform4fv(vShaderDiffuseProduct, 1, diff);
vec4 spec = vec4(0.80f,0.80f,0.80f,1.0f);
glUniform4fv(vShaderSpecularProduct, 1, spec);
float shin = 6.0f;
glUniform1f(vShaderShininess,shin);


glClearColor(.2, .2, .2, 1); /* Grey background */
}
void init(){
//创建顶点数组对象
GLuint-vao;
#苹果__
Glgenvertexaraysapple(1,&vao);
glBindVertexArrayAPPLE(vao);
#否则
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
#恩迪夫
//创建并初始化缓冲区对象
胶合缓冲液;
realVec*normArray=new realVec[mCubes.getNormalArraySize()];//与vec3数组相比,vec4数组
normArray=mCubes.getNormalVector();//新的法线数组

对于(int i=0;i您可以使用以下代码传递
vNormal
属性数据

glVertexAttribPointer(vShaderNormal, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset));
这表示法线有4个组件,而在顶点着色器中,将其声明为

attribute vec3 vNormal;

如果法线被误解,这种不匹配可能与您的问题有关。

您使用以下代码传递
vNormal
属性数据

glVertexAttribPointer(vShaderNormal, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(offset));
这表示法线有4个组件,而在顶点着色器中,将其声明为

attribute vec3 vNormal;

如果法线被误解,这种不匹配可能与您的问题有关。

告诉我们什么是mCubes(它的方法返回什么)McUbbe只是C++类的一个大难题的另一个部分。我不能向大家展示它们,但是McUbbe对McUbS的调用是很自我解释的。它可以返回三角形的垂直数组,或者顶点数组的大小,或者三角形(元素)的数量。,或法线向量数组。是否可以更新代码以包含已找到的更正?这样可以更轻松地跟踪实际问题。当然,我将在其中添加一条“注释”,说明我已更改。感谢您的建议。向我们展示什么是mCubes(其方法返回什么)McUbbe只是C++类的一个大难题的另一个部分。我不能向大家展示它们,但是McUbbe对McUbS的调用是很自我解释的。它可以返回三角形的垂直数组,或者顶点数组的大小,或者三角形(元素)的数量。,或法线向量数组。是否可以更新代码以包含已找到的更正?这样可以更轻松地跟踪实际问题。当然,我会在其中添加一条“注释”,说明我已被更改。感谢您的建议。具有讽刺意味的是,当我“更正”此问题时,我得到了这样一条消息:这是没有任何颜色的!可以吗您详细说明了如何“纠正”这一点?法线的实际内存布局是什么?您是否尝试在片段着色器中显示
vNormal
给出的值以“查看”它们是否正确?我添加了一个“纠正”init()函数到底部。我不想替换另一个,以便人们可以跟随。我担心问题可能在于法线…我必须承认,我不确定法线值的正确范围,但我得到的值大多是+-0.30###,+-0.90###,+-0.70####,0.0,1.0。我认为这是不正确的,并将尝试找出是否正确不是。考虑一下你的法线可能是指向“in”而不是“OUT”,这样你只能看到多边形的背面,而不是前面的颜色和阴影。讽刺的是,当我纠正这个问题时,我得到了:这是没有任何颜色的。你能详细说明你如何“纠正”这一点吗?什么是实际记忆La?你的法线是多少?你是否尝试在片段着色器中显示
vNormal
给出的值以“查看”它们是否正确?我添加了一个“更正的”init()函数到底部。我不想替换另一个,以便人们可以跟随。我担心问题可能在于法线…我必须承认,我不确定法线值的正确范围,但我得到的值大多是+-0.30###,+-0.90###,+-0.70####,0.0,1.0。我认为这是不正确的,并将尝试找出是否正确不是。考虑你的法线可能被指向“in”而不是“OUT”,这样你只能看到多边形的背面,而不是前面的颜色和阴影。
attribute vec3 vNormal;