在HLSL中,我必须使用语义将信息从顶点着色器传递到片段着色器.在GLSL中,不需要语义.语义的客观利益是什么?
示例:GLSL
顶点着色器
varying vec4 foo
varying vec4 bar;
void main() {
...
foo = ...
bar = ...
}
Run Code Online (Sandbox Code Playgroud)
片段着色器
varying vec4 foo
varying vec4 bar;
void main() {
gl_FragColor = foo * bar;
}
Run Code Online (Sandbox Code Playgroud)
示例:HLSL
顶点着色器
struct VS_OUTPUT
{
float4 foo : TEXCOORD3;
float4 bar : COLOR2;
}
VS_OUTPUT whatever()
{
VS_OUTPUT out;
out.foo = ...
out.bar = ...
return out;
}
Run Code Online (Sandbox Code Playgroud)
像素着色器
void main(float4 foo : TEXCOORD3,
float4 bar : COLOR2) : COLOR
{
return foo * …Run Code Online (Sandbox Code Playgroud) 我有一个用GLSL编写的简单的OpenGL 3.3片段着色器.从本质上讲,我正在评估sin(x)适度大的x(10,000到2,000,000之间),如下所示:
#version 330
out vec4 fColor;
void main() {
fColor = vec4(sin(gl_FragCoord.x * gl_FragCoord.y));
}
Run Code Online (Sandbox Code Playgroud)
它在我的NVidia显卡上工作正常,但在我的Intel HD4000上,正弦仅返回四个不同的值(+/- 1.0和大约+/- 0.3),高于大约10,000的输入.
系统:Windows 64bit,(Intel)驱动程序版本15.28.20.64.3347.
我的问题:这是一个错误吗?或者供应商是否可以通过这种方式自由实施正弦?
我的Android应用程序是全屏OpenGL ES 2.0应用程序,因此主要内容是GLSurfaceView的自定义扩展.活动布局如下所示:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawer_layout">
<FrameLayout android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
然后我使用FrameLayout的addView方法添加我的GLSurfaceView.如果我不这样做,抽屉按预期工作.
当我将其滑入时,ListView似乎被正确拉出,因为我无法再与GLSurfaceView交互,直到我向左滑动它.但它根本没有显示,就像GLSurfaceView总是在它上面渲染一样.
如何使用GLSurfaceView作为其内容使用DrawerLayout?
我正在使用自定义着色器创建网格.在顶点着色器中,我正在修改几何顶点的原始位置.然后我需要从着色器外部访问这个新的顶点位置,我该如何实现呢?
我正在使用C++开发BlackJack游戏,我在其中有以下代码,我收到错误
typedef struct
{
int value;
char suit[8];
char name[8];
}Deck;
Deck Cards[52] = {{ 1,"Ace","Hearts"},{ 2, "Two","Hearts"}, { 3, "Three", "Hearts"}, { 4, "Four","Hearts"}, { 5,"Five","Hearts"},{ 6,"Six", "Hearts06"},
{ 7,"Seven","Hearts"},{ 8,"Eight","Hearts"},{ 9,"Nine","Hearts"},{ 10,"Ten","Hearts"},{10,"Jack","Hearts"},{10,"Queen","Hearts"},{10,"King","Hearts"},
{ 1,"Ace","Clubs"},{2, "Two", "Clubs"},{3,"Three","Clubs"},{4,"Four","Clubs"},{5,"Five","Clubs"},{6,"Six","Clubs"},{7,"Seven","Clubs"},{8,"Eight","Clubs"},
{ 9,"Nine","Clubs"},{10,"Ten","Clubs"},{10,"Jack","Clubs"},{10,"Queen","Clubs"},{10,"King","Clubs"},
{ 1,"Ace","Diamonds"},{2,"Two","Diamonds"},{3,"Three","Diamonds"},{4,"Four","Diamonds"},{5,"Five","Diamonds"},{6,"Six","Diamonds"},{7,"Seven","Diamonds"},
{ 8,"Eight","Diamonds"},{9,"Nine","Diamonds"},{10,"Ten","Diamonds"},{10,"Jack","Diamonds"},{10,"Queen","Diamonds"},{10,"King","Diamonds"},
{ 1,"Ace","Spades"},{ 2,"Two","Spades"},{3,"Three","Spades"},{4,"Four","Spades"},{5,"Five","Spades"},{6,"Six","Spades"},{7,"Seven","Spades"},
{ 8,"Eight","Spades"},{ 9,"Nine","Spades"},{10,"Ten","Spades"},{10,"Jack","Spades"},{10,"Queen","Spades"},{10,"King","Spades"}};
Run Code Online (Sandbox Code Playgroud)
该错误是
Main.c:39:127: error: initializer-string for array of chars is too long [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
第39行是上面发布的代码中的最后一行
请帮我弄清楚编译器抛出错误的原因
在尝试在iOS 8键盘扩展中使用SpriteKit时,我遇到了许多崩溃,这些崩溃只发生在使用物理设备而未连接到调试器时.
如果调试器连接到设备,或者如果在SIM卡中运行,一切都很可爱.
当没有连接调试器时,我相信扩展的生命周期略有不同,有时候键盘扩展会背景化,导致OpenGL崩溃.
苹果技术说明中描述了我们遇到的崩溃.它位于函数gpus_ReturnNotPermittedKillClient中,并且Apple声明它出现是因为您无法在后台运行OpenGL,并建议使用App Delegate回调来暂停您的OpenGL活动.
由于这是键盘扩展,因此没有应用程序委托.相反,我们尝试注册app委托生命周期通知:没有运气 - 他们不会开火.所以我们尝试使用viewcontroller生命周期回调,它仍然无法解决问题.
当这次崩溃发生时,我们是活跃的键盘,并且只是围绕SpriteKit/SKView和UIImage操作做了很多事情,没有明显的理由我们为什么会背景,但是这种崩溃发生了.如果我们真正做到背景,似乎也会发生同样的崩溃.
最后,我试图弄清楚如何知道我们正在进行背景化,并且我们需要暂停OpenGL.
这是完整的堆栈:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000001
Triggered by Thread: 0
Thread 0 name: Dispatch queue: com.apple.spritekit.renderQueue
Thread 0 Crashed:
0 libGPUSupportMercury.dylib 0x000000018e89a18c gpus_ReturnNotPermittedKillClient + 12
1 libGPUSupportMercury.dylib 0x000000018e89b124 gpusSubmitDataBuffers + 160
2 GLEngine 0x0000000189a10260 gliPresentViewES_Exec + 192
3 GLEngine 0x0000000189a10164 gliPresentViewES + 80
4 OpenGLES 0x0000000189a1fc7c -[EAGLContext presentRenderbuffer:] + 68
5 SpriteKit 0x000000018a51c4a4 -[SKView _renderContent] + 1028
6 libdispatch.dylib 0x0000000196c8d368 _dispatch_client_callout + 12
7 …Run Code Online (Sandbox Code Playgroud) 我在28byteslater.com上阅读了关于延迟着色的MSAA的本教程.
它说,在显式多重采样中,我们可以访问特定的样本.
难道我们不能从GL_TEXTURE_2D_MULTISAMPLE例如绑定的常规纹理中做同样的事情吗?
这是我之前用于访问单个样本的着色器代码(不使用明显的多重采样):
uniform sampler2DMS Diffuse;
ivec2 Texcoord = ivec2(textureSize(Diffuse) * In.Texcoord);
vec4 colorFirstSample = texelFetch(Diffuse, Texcoord, 0);
vec4 colorSecondSample = texelFetch(Diffuse, Texcoord, 1);
vec4 colorThirdSample = texelFetch(Diffuse, Texcoord, 2);
Run Code Online (Sandbox Code Playgroud)
我在显式多重采样中看到的唯一不同之处是它们texelFetchRenderbuffer()在着色器中使用并且纹理被绑定GL_TEXTURE_RENDERBUFFER_NV.加上如果我没记错,它在着色器中不可能使用RenderBuffer,现在我们可以吗?
所以我正在制作一个可以使用 directx10,11 和 opengl 的引擎。
到目前为止一切都很顺利。它可以正确渲染 opengl 和 directx 中的图像,并且两者看起来相同。
现在我添加了渲染目标。在 DirectX 中它运行得很好并且到目前为止没有任何问题。但是使用 OpenGL,我之前绘制的纹理是颠倒的,位于渲染目标的右下角。

你们知道问题是什么吗?为什么它在没有渲染目标的情况下也能正常工作?
如果需要我可以发送一些代码。我只需要先排序。
int width, height;
BYTE * data;
FILE * file;
// open texture data
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
// allocate buffer
width = 256;
height = 256;
data =(BYTE*) malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
//gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data ); …Run Code Online (Sandbox Code Playgroud) 出于教育目的,我需要比较WebGL与OpenGL的性能。我有两个用WebGL和OpenGL编写的等效程序,现在需要获取它们的帧速率并进行比较。
在Javascript中,我使用requestAnimationFrame了动画效果,并且注意到它使帧频始终为60 FPS,并且只有在切换标签页或窗口时才会降低。另一方面,如果我总是递归地调用render函数,则由于明显的原因,窗口会冻结。
var stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.left = '450px';
stats.domElement.style.top = '750px';
document.body.appendChild( stats.domElement );
setInterval( function () {
stats.begin();
stats.end();
}, 1000 / 60 );
var render= function() {
requestAnimationFrame(render);
renderer.render(scene,camera);
}
render();
Run Code Online (Sandbox Code Playgroud)
现在,如果场景始终以60 FPS的速度存在问题,那就是我实际上无法将其与OpenGL的帧速率进行比较,因为OpenGL仅在以某种方式修改场景(例如,如果旋转对象)并glutPostRedisplay()调用场景时才重绘场景。
因此,我猜想WebGL中是否只有在必要时才可以重绘场景,例如,旋转对象或更改着色器中的某些属性时。