Archief - [PROG]openGL renderen naar een FBO

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

zarathustra

Legacy Member
Code:
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_fbo);
	glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
	bindCgPrograms();
	glPushMatrix();
	glutSolidSphere(1.0,40,32);
	glPopMatrix();
	unBindCgPrograms();

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();

	// place camera/eye
	glTranslatef(xTranslate,yTranslate,zDepth);
	glRotatef(-yRotation,1.0,0.0,0.0);
	glRotatef(-xRotation,0.0,1.0,0.0);

	glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
    glReadPixels(0, 0, 500, 500,GL_RGBA,GL_FLOAT,result);
		printf("Data after roundtrip:\n");
		int i =0;
		while(i <= 500*500*4){
		std::cout << i << " : " << result[i] << result[i+1] << result[i+2] << result[i+3] << std::endl;
		i = i+4;
	}


Dit is dus een deel van mijn openGL code, als ik dat gewoon direct naar scherm render krijg ik een diffuus shaded bol uit die cg shaders. Maar blijkbaar als ik dat daar output heeft hij nu enkel de input van glClearColor naar het FBO geschreven. Iemand enig idee hoe ik de output van de cg dingen in mijn buffer krijg?

zarathustra

Legacy Member
tsk niemand met openGL/cg skills? :p

anyway, probleem is al een beetje opgelost. de bol verschijnt nu wel op het scherm maar staat vol artefacts wanneer ik hem roteer >_>

Dus iedereen die nog relevante code samples en/of tutorials weet mag die hier altijd posten

zarathustra

Legacy Member
in de categorie 'als ik vragen blijf stellen zal er wel eentje zijn die kan beantwoord worden'

voorbeeldje ==> theepot

u ziet daar een mooie 'crack' over de theepot, het is ashikhmin-shirley shading die hier geimplementeerd is, in cg. Iemand enig idee wat die lijn veroorzaakt? >_>

killgore

Legacy Member
normalen staan goed ingesteld en zo (genormaliseerd)?

Kga u code strx is bekijken, vreemd dak over deze thread heb heengelezen :/.

zarathustra

Legacy Member
hmm, die normalen zouden normaal gezien goed moeten staan aangezien dat een standaard glut ding is. Naar die FBO code moet ge niet al te hard meer zien, dat trok op niet veel ^^

maar ik kan wel de code van die shader hier zetten

vertexshader

Code:
void ashikhminShirleyVertexProgram(
	float4 position		: POSITION,
	float3 normal		: NORMAL,
	
	out float4 oPosition	: POSITION,
	out float3 objectPos	: TEXCOORD0,
	out float4 iPosition	: TEXCOORD1,
	out float3 oTangent		: TEXCOORD2,
	out float3 oNormal		: TEXCOORD3,
	out float3 oBinormal	: TEXCOORD4 )
{
	oPosition = mul(glstate.matrix.mvp, position);
	iPosition = position;
	float4 normal4;
	normal4.xyz = normal.xyz;
	normal4.w = 0;
	oNormal = mul(glstate.matrix.invtrans.modelview[0], normal4).xyz;
	
	float4 tangent;
	
	float3 c1 = cross(normal, float3(0.0, 0.0, 1.0));
	float3 c2 = cross(normal, float3(0.0, 1.0, 0.0));
	
	if(length(c1)>length(c2))
	{
		tangent.xyz = c1;	
	}
	else
	{
		tangent.xyz = c2;	
	}
	
	tangent.w = 0;
	oTangent = mul(glstate.matrix.invtrans.modelview[0], tangent).xyz;
	objectPos = position.xyz;
	

	oBinormal = cross(oTangent, oNormal);
}

fragment shader
Code:
void ashikhminShirleyFragmentProgram(
	float4 position		: TEXCOORD0,
	float4 iPosition	: TEXCOORD1,
	float3 tangent		: TEXCOORD2,
	float3 normal		: TEXCOORD3,
	float3 binormal		: TEXCOORD4,

	out float4 color	: COLOR,
	
	uniform float3 globalAmbient,
	uniform float3 lightColor,
	uniform float3 lightPosition,
	uniform float3 Ke,
	uniform float3 Ka,
	uniform float3 Kd,
	uniform float3 Ks,
	uniform float shininess )
{

	const float Pi = 3.14159;
	float Mx = 100;
	float My = 10;

	float3 P = mul(glstate.matrix.modelview[0], iPosition).xyz;
	float3 N = normalize(normal);
	float3 T = normalize(tangent);
	float3 B = normalize(binormal);
	
	float3 L = normalize(lightPosition - P);
	float3 V = normalize(-P);
	float3 H = normalize(L + V);
	
	
	// Compute the emissive term
	float3 emissive = Ke;

	// Compute the ambient term
	float3 ambient = Ka * globalAmbient;

	// Compute the diffuse term
	float3 diffuseFactor1 = ((28 * Kd) / (23 * Pi));
	float3 diffuseFactor2 = (1-Ks) * ( 1-pow(( 1- (dot(N, V)/2)),5));
	float3 diffuseFactor3 = ( 1- pow(( 1- (dot(N, L)/2)),5));
	
	float3 diffuse = diffuseFactor1 * diffuseFactor2 * diffuseFactor3;

	
	
	// Compute the specular term
	
	float specularFactor1 =  pow(((Mx+1)*(My+1)),0.5)/(8*Pi);
	float3 specularFactor2 = pow(dot(N, H),( ( (Mx*pow(dot(T, H),2)) + (My*pow(dot(B, H),2)))/(1-pow((dot(N, H)),2))));
	float3 specularFactor3 = dot(H, L) * max(dot(N, V), dot(N, L));
	float3 specularFresnel = Ks + (1-Ks)*pow((1-dot(H, L)),5);
	float3 specular = specularFactor1 * specularFactor2/specularFactor3 * specularFresnel;
	
	color.xyz = emissive + ambient + diffuse + specular;
	color.w = 1;
}

ik ben niet 100% zeker van de waarden in die speculaire termen tho, ik heb 2 papers gelezen en dat sprak elkaar precies tegen.. of ik heb miskeken

killgore

Legacy Member
ehm, welke taal is dit juist :)? Std C lijkt het mij niet.

Anyway, op het eerste zicht (srry, nog niet veel tijd gehad :() zie ik niet direct iets mis, maar tis dan ook niet iets waar ek echt vreselijk veel van afweet moet ik zeggen, ik heb me nog niet enorm veel beziggehouden met glsl. Wat me wel opvalt is dat je ergens een 3D vector naar 4D vector omzet en w op 0 stelt, moet dit geen 1 zijn?

edit: dit dus:
Code:
	normal4.xyz = normal.xyz;
	normal4.w = 0;

Tyfius

Legacy Member
Dat is inderdaad geen std C maar een speciale Microsoft implementatie voor OpenGL onder Windows als ik me niet vergis.

zarathustra

Legacy Member
tsk

het is een C gebaseerde taal voor op de GPU te programmeren ^^ aka Cg, google maar eens op nvidia + Cg. Nuja ik heb het al opgelost, ik had mijn tangents niet goed berekend. En wat die FBO betreft, een depth buffer vergeten attachen

killgore

Legacy Member
Ah, das Cg :). Had ik al van gehoord, nog nooit in geschreven, wel eens interessant om te zien.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan