我发现我的片段着色器仅限于OpenGL ES视口的像素尺寸.
我可以创建一个"屏幕外片段着色器"或渲染环境,它具有更多像素用于渲染吗?
我很好奇你如何指定使用glDrawElements()渲染时使用的着色器.它是使用绑定的最后一个着色器吗?或者你必须使用其他命令.
总结一下:当我使用glDrawElements()时,如何指定使用哪个着色器,即将在我渲染的VBO中的三角形上使用的着色器.
我在片段着色器上做了一些工作,允许纹理渲染和颜色渲染.在我做了更改后,我的所有纹理都非常像素化(就像一个旧的8位游戏),我不得不提高纹理坐标的精度到中等.这也给我带来了性能影响.我只是不明白为什么我突然不得不首先改变精度.
这是"原始"着色器:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
uniform lowp float opacity;
void main(void) {
gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}
Run Code Online (Sandbox Code Playgroud)
这是着色器在更改后的样子:
varying mediump vec2 TexCoordOut;
uniform sampler2D Texture;
uniform lowp vec4 color;
uniform lowp float opacity;
uniform int colorRender;
void main(void) {
if (colorRender == 1)
{
gl_FragColor = color;
} else {
gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}
}
Run Code Online (Sandbox Code Playgroud) 有些东西我对OpenGL并不完全了解:根据我正在阅读的所有内容,通过将着色器编译得足够长以将它们附加到程序中来获得最佳性能,然后建议您将着色器本身删除为可用内存,只需跟踪程序,直到删除它为止.
所以我的问题是:如果上述情况属实,那么在创建程序后能够附加着色器并重新链接程序的目的是什么?在场景创建期间创建第二个着色器程序并在它们之间交换而不是分离/附加和重新链接程序是不是更有效?
我试图通过使用if(caps.VertexShaderVersion < D3DVS_VERSION(i, 0)){return false;}我想要检查的着色器模型来检测我的图形卡在C++中具有的最高着色器模型是什么,但我只能达到3.
问题是我已经检查了我的显卡(Gigabyte GeForce GTX 470)并且它有DirectX 11所以不应该有Shader Model 5吗?或者我正在检查Shader模型的方式有问题吗?
我正在使用着色器编写程序,并在运行构建的exe时遇到一些错误.
着色器程序无法链接
片段着色器使用不同的颜色,但以前的着色器不会写入它.
出于资源错误.
这是我的代码:
example.cpp:
// Two-Dimensional Sierpinski Gasket
// Generated using randomly selected vertices and bisection
#include "Angel.h"
const int NumTimesToSubdivide = 5;
const int NumTetraeder = 1024;
const int NumVertices = 9 * NumTetraeder;
vec4 points[NumVertices];
int Index = 0;
int fps = 20;
float angle_param = 0.5;
float etime;
GLint time_loc;
//----------------------------------------------------------------------------
void triangle(const vec4& a, const vec4& b, const vec4& c)
{
points[Index++] = a;
points[Index++] = b;
points[Index++] = c;
}
void divide_tetraeder(const vec4& …Run Code Online (Sandbox Code Playgroud) 我正在使用兰伯特着色器,例如,它设置材料如下:
this.material.uniforms.emissive.value = new THREE.Color(
Math.random(),
Math.random(),
Math.random());
Run Code Online (Sandbox Code Playgroud)
在我拥有一个简单的着色器之前,我需要像这样设置材质来控制Alpha:
this.material.uniforms.color.value = new THREE.Vector4(
Math.random(),
Math.random(),
Math.random(),
0.3)
Run Code Online (Sandbox Code Playgroud)
但是看起来朗伯着色器没有颜色vector4。
关于如何控制Alpha的任何想法?
我从这里对lambert着色器使用相同的示例:https : //forge.autodesk.com/blog/forge-viewer-custom-shaders-part-2
而且简单的着色器来自:http : //adndevblog.typepad.com/cloud_and_mobile/2017/01/forge-viewer-custom-shaders-part-1.html
我正在尝试实现GLSL着色器,该着色器将突出显示渲染的3D网格的外部边缘。问题是我无权访问OpenGL客户端代码,因此只能在GLSL着色器中完成。
我的第一个尝试是从Unity使用/采用此着色器,并在OpenGL GLSL中进行操作。这里看起来应该是这样:
这是我得到的:
我不确定我是否可以正确计算内容,但是如您所见,输出与我的期望值相差甚远。
这是食人魔的材料
material Chassis
{
technique
{
pass standard
{
cull_software back
scene_blend zero one
}
pass psssm
{
cull_software front
scene_blend src_alpha one_minus_src_alpha
vertex_program_ref reflection_cube_specularmap_normalmap_vs100
{
param_named_auto modelViewProjectionMatrix worldviewproj_matrix
param_named_auto normalMatrix inverse_transpose_world_matrix
param_named_auto modelView worldview_matrix
param_named_auto camera_world_position camera_position
param_named_auto inverse_projection_matrix inverse_projection_matrix
param_named_auto projection_matrix projection_matrix
param_named_auto p_InverseModelView inverse_worldview_matrix
}
fragment_program_ref reflection_cube_specularmap_normalmap_fs100
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是顶点着色器
material Chassis
{
technique
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用实例渲染来绘制大量的立方体.现在,显然立方体中可见面的最大数量是3,这意味着就着色而言,我所做的工作量是所需的两倍.
因为这是实例化,所以我不能简单地只传递要绘制到着色器的几何体.但是如果在着色器中(我想象这将是几何形状或细分)我可以使用普通信息来丢弃基元,我可以减少不必要的操作数量.
例如,如果观察方向和表面法线之间的角度小于90度,我可以假设在当前方向前面有一个三角形,因此丢弃了这个给定的图元.
在管道中是否有一种方法可以确定是否需要片段并相应地丢弃它?
我正在使用以下着色器源代码来实现顶点和片段.
顶点着色器源:
#define highp
attribute highp vec3 position;
uniform highp mat4 mvp;
void main(void)
{
gl_Position = mvp * vec4(position, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
片段着色器源:
#define highp
uniform highp vec3 color;
void main(void)
{
gl_FragColor = vec4(color, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
但是,着色器无法正常工作.如下面的屏幕截图所示,3D对象的颜色就像2D对象一样:
glGetShaderiv带有GL_COMPILE_STATUS返回success == TRUE,因此没有着色器编译错误.
glGetShaderiv(shaderObj, GL_COMPILE_STATUS, &success);
Run Code Online (Sandbox Code Playgroud)
我没有尝试glGetError()代码.我要去尝试一下.但我怀疑我没有收到任何OpenGL错误.
我相信我需要调整color顶点和片段着色器.我应该如何调整着色器源中的颜色?任何人都可以通过暗示来帮助我.到目前为止,我无法通过修改源来解决问题.
在@ Rabbid76 的帮助下,3D对象看起来很不错:
我正在使用@ Rabbid76代码进行一些小修改:将#version 130顶点和片段着色器源添加到顶部.看起来我的英特尔显卡需要该#version 130指令,否则会引发一些警告和错误:
警告:片段着色器中不支持扩展"GL_OES_standard_derivative"
该#version 130指令解决了上述警告及其后续错误.