- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的着色器有点问题。
顶点
varying vec3 normal, lightDir, eyeVec, spotDir;
varying mat4 viewMat;
uniform vec4 posluce; \\this is light position
uniform mat4 matrix;
uniform vec3 spotdir;
void main(){
viewMat = inverse(matrix);
vec3 posLuceWorld = (posluce*viewMat).xyz;
spotDir = normalize(vec3(vec4(spotdir,0)*viewMat));
normal = gl_NormalMatrix * gl_Normal;
vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex);
lightDir = normalize(posLuceWorld.xyz - (gl_Vertex * viewMat).xyz);
eyeVec = normalize(-vVertex);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
片段
varying vec3 normal, lightDir, eyeVec,spotDir;
varying mat4 viewMat;
const float cos_outer_cone_angle = 0.8; // 36 degrees
void main (void){
vec4 amb = vec4(0.1, 0.1, 0.1, 1.0);
vec4 diff = vec4(0.52, 0.81, 0.98, 1.0);
vec4 spec = vec4(0.52, 0.81, 0.98, 1.0);
float exp = 2.5f;
float cutoff = 25.0f;
float cosCut = cos(cutoff);
vec4 final_color =
(gl_FrontLightModelProduct.sceneColor * gl_FrontMaterial.ambient) +
(amb * gl_FrontMaterial.ambient);
vec3 L = lightDir;
vec3 D = spotDir;
float cos_cur_angle = dot(-L, D);
float cos_inner_cone_angle = cosCut;
float cos_inner_minus_outer_angle =
cos_inner_cone_angle - cos_outer_cone_angle;
float spot = 0.0;
spot = clamp((cos_cur_angle - cos_outer_cone_angle) /
cos_inner_minus_outer_angle, 0.0, 1.0);
vec3 N = normalize(normal);
float lambertTerm = max( dot(N,L), 0.0);
if(lambertTerm > 0.0){
final_color += diff *
exp *
gl_FrontMaterial.diffuse *
lambertTerm * spot;
vec3 E = eyeVec;
vec3 R = reflect(-L, N);
float specular = pow( max(dot(R, E), 0.0),
gl_FrontMaterial.shininess );
final_color += spec *
gl_FrontMaterial.specular *
specular * spot;
}
gl_FragColor = final_color;
}
我的展示功能:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//Setting camera using orthonormal frame manipulation
Matrix4x4 m;
//Change view with mouse
buildRotationMatrix(camera.frame.Yaxis, deg2rad(-yrot), m);
transform(m, camera.frame.Xaxis);
transform(m, camera.frame.Yaxis);
transform(m, camera.frame.Zaxis);
//i traslate myself with the Keyborad
if (up_key){
camera.position.x += -camera.frame.Zaxis.x * speed;
camera.position.y += -camera.frame.Zaxis.y * speed;
camera.position.z += -camera.frame.Zaxis.z * speed;
}
if (down_key){
camera.position.x += camera.frame.Zaxis.x * speed;
camera.position.y += camera.frame.Zaxis.y * speed;
camera.position.z += camera.frame.Zaxis.z * speed;
}
if (left_key){
camera.position.x += -camera.frame.Xaxis.x * speed;
camera.position.y += -camera.frame.Xaxis.y * speed;
camera.position.z += -camera.frame.Xaxis.z * speed;
}
if (right_key){
camera.position.x += camera.frame.Xaxis.x * speed;
camera.position.y += camera.frame.Xaxis.y * speed;
camera.position.z += camera.frame.Xaxis.z * speed;
}
pitch-=xrot*0.5; // change view speed
if (pitch>90) pitch=90;
if (pitch<-90) pitch=-90;
Camera temp(camera);
Matrix4x4 m2;
buildRotationMatrix(temp.frame.Xaxis, deg2rad(pitch), m2);
transform(m2, temp.frame.Xaxis);
transform(m2, temp.frame.Yaxis);
transform(m2, temp.frame.Zaxis);
Matrix4x4 c;
buildCameraMatrix(temp,c);
glMultMatrixf(c.GL_array());
if(mouse_moved){
mouse_moved=false;// this force my mouse in center
glutWarpPointer(width/2, height/2);
}
xrot=yrot=0;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLdouble ratio = static_cast<GLdouble>(width) / static_cast<GLdouble>(height);
gluPerspective(45, //angolo di visuale
ratio, //aspect ratio (rapporto tra larghezza e altezza)
1, //Z near cutting plane
1000); //Z far cutting plane
glMatrixMode(GL_MODELVIEW);
glUseProgram(ShaderProgram);
GLint matrixR = glGetUniformLocation(ShaderProgram, "matrix");
glUniformMatrix4fv(matrixR, 1, GL_FALSE, c.GL_array());
GLint spot = glGetUniformLocation(ShaderProgram, "spotdir");
float spotdirr[3] = {0.0, -1.0, 1.0};
glUniform3fv(spot,1,spotdirr);
GLint pos = glGetUniformLocation(ShaderProgram, "posluce");
float light0_position[4] = {-0.17252*scale, 0.73089*scale, -0.52868*scale, 1};
glUniform4fv(pos,1,light0_position);
glPushMatrix();
creaPavimento(); \\this create my floor
glPopMatrix();
glPushMatrix();
GLfloat front_mat_diffuse[] = {0.25, 0.4, 0.98, 1.0};
GLfloat front_mat_spec[] = {0.4, 0.4, 0.4, 1.0};
GLfloat front_mat_ambi[] = {0.25, 0.25, 0.25, 1.0};
glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse);
glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_spec);
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, front_mat_ambi);
GLfloat mShininess[] = {2};
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mShininess);
glTranslatef(0.0,1.0,6.0);
glutSolidSphere(0.5, 20, 20);
glPopMatrix();
glFlush();
glutSwapBuffers();
当我使用这个着色器时,我得到的光不会照亮我的地板,而只会照亮一个球体我的问题:为什么?怎么了?如果我使用 OPENGL 标准灯效果很好。
我不能发布图片。抱歉我的英语不好。
编辑:
我改变了一点着色器。现在为地板和球体工作,但是,虽然球体适合地板,但截止点完全错误,方向错误。
顶点:
varying vec3 normal, lightDir, eyeVec, spotDirection;
varying mat4 viewMat;
uniform vec4 posluce;
uniform mat4 matrix;
uniform vec3 spotdir;
void main(){
viewMat = inverse(matrix);
spotDirection = normalize(vec3(vec4(spotdir,0.0)*viewMat));
vec3 lightPosition = (posluce * viewMat).xyz;
normal = gl_NormalMatrix * gl_Normal;
vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex);
lightDir = normalize( (gl_Vertex * viewMat).xyz + lightPosition);
eyeVec = -vVertex;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
这是新片段:
varying vec3 normal, lightDir, eyeVec,spotDirection;
varying mat4 viewMat;
const float cos_outer_cone_angle = 0.8; // 36 degrees
void main (void){
vec4 amb = vec4(0.1, 0.1, 0.1, 1.0);
vec4 diff = vec4(0.52, 0.81, 0.98, 1.0);
vec4 spec = vec4(0.52, 0.81, 0.98, 1.0);
float exp = 2.5f;
float cutoff = 25.0f;
float cosCut = cos(cutoff);
vec4 final_color =
(gl_FrontLightModelProduct.sceneColor * gl_FrontMaterial.ambient) +
(amb * gl_FrontMaterial.ambient);
vec3 L = normalize(lightDir);
vec3 D = normalize(spotDirection);
float cos_cur_angle = dot(-L, D);
float cos_inner_cone_angle = cosCut;
float cos_inner_minus_outer_angle =
cos_inner_cone_angle - cos_outer_cone_angle;
float spot = 0.0;
spot = clamp((cos_cur_angle - cos_outer_cone_angle) /
cos_inner_minus_outer_angle, 0.0, 1.0);
vec3 N = normalize(normal);
float lambertTerm = max( dot(N,L), 0.0);
if(lambertTerm > 0.0){
final_color += diff *
exp *
gl_FrontMaterial.diffuse *
lambertTerm * spot;
vec3 E = normalize(eyeVec);
vec3 R = reflect(-L, N);
float specular = pow( max(dot(R, E), 0.0),
gl_FrontMaterial.shininess );
final_color += spec *
gl_FrontMaterial.specular *
specular * spot;
}
gl_FragColor = final_color;
}
最佳答案
如果我正确理解您的代码和注释,球体、灯光和相机位于立方体内部。这意味着立方体的法线朝外(您正在看它的背面),因此点积 dot(N,L)
为负,这使得 lambert_term
等于 0
。这反过来会导致整个照明计算被跳过。
您有两个选择。修改着色器以照亮背面和正面,或者使用正确朝向的法线渲染立方体。
关于c++ - opengl-glsl单虚光,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20743857/
我有一个 OGre3D+Hikari 应用程序,我想在其背景中循环使用 flash 动画。 我尝试调整 createFlashOverlay 中的一些参数(特别是 zorder 和层),但没有任何改变
奇怪的问题,但只是在寻找指导或建议。我的网络应用程序具有协助运算符(operator)计时的功能。我的任务是从 mysql php 触发器打开红色闪光灯(警灯)? 可以这样做吗,因为我认为网站无法与我
我对 WIX 相当陌生,所以如果我完全错过了这里的船,请原谅我,但我想知道是否可以在 wxs 文件中重用组件(mwm、cab 等)而无需重新链接它们每次。我正在使用的安装程序有几个可执行文件、dll
我喜欢 MVVM Light 的 Messenger 及其灵 active ,但是当我忘记显式注销收件人时(在 Silverlight 4 中),我遇到了内存泄漏问题。 原因解释here ,但我对此表
当我在 Visual Studio 2010 中安装 MVVM Light v3.xx 后,我有许多用于创建 MVVM 项目的模板。 但我需要全新安装 Visual Studio,在这种情况下我安装了
我刚开始使用 libgdx 创建游戏。这是一个使用 scene2d ui 的自上而下的 2d 射击游戏。现在我想,我可以在某些层面上添加黑暗和光明,但我不想使用 box2d 重写所有内容。我不需要逼真
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试将我的 Windows Phone 8 Silverlight 应用程序转换为 8.1 Phone 应用程序作为通用应用程序的一部分。我不知道这是否相关,因为这是我第一次尝试正确实现 Vie
我收到以下消息,在 Spring Cloud 数据流中运行任务。 DEBUG 13167 --- [spring_batch146] com.zaxxer.hikari.pool.HikariPool
我使用带有中继器控件的 jQuery Light Slider 来显示数据库中的图像,如下所示: '> ' run
我熟悉 MVVM Light 工具包的 ViewModelBase、Message,但不熟悉 ViewModelLocator。在我的应用程序中有 Singleton ViewModel,例如 Pri
我是 MVVM 的新手,所以如果这个问题有一个简单的答案,我深表歉意,但我无法通过搜索 Google 来解决这个问题。 所以,基本上,我正在使用 MVVM Light 制作 Windows 10 通用
我已经创建了我的第一个 MVVMLight 项目,我有一个问题: 我有一个按钮,上面绑定(bind)了一个命令。当命令执行时,在不同的用例中,我必须向最终用户获取/提供信息,例如: 如果项目是新的,询
我正在通过播放框架和 mariadb 客户端使用 hikari 池连接,因为我已经定期更新它们(播放 2.6.5 -> 2.6.6 和 mariadb 2.1.1 -> 2.1.2 但不确定它是否相关
关于如何在 ViewModel 中定义一个 RelayCommand 有几个例子: 选项 1(惰性): /// /// Gets the LogOnCommand. /// /// The Log
我正在处理一个示例 MVVM Light 项目并正在实现 SimpleIoc ViewModelLocator。我已经能够构建一个 IRepositoryService,它从数据库(即公司、员工等)中
我们在 Windows 8.1 中有一个与 Win 10 兼容的工作项目。现在的要求是将此项目转换为 UWP。在早期的项目中,我们使用了 PRISM 作为 MVVM 的框架。现在的问题是,对于UWP应
在the latest release of MVVM Light note ,已表明 MVVM Light 现在提供“导航服务”。 但是我自己和我 friend google都找不到怎么用。 我可以
我是一名优秀的程序员,十分优秀!